可以用符合 OSGi 元类型服务规范的元数据来描述每项服务的配置属性。元数据可以包含缺省值、可翻译的名称和描述以及允许对输入值进行验证的信息。依照规范,所产生 XML
文件会打包到 OSGI-INF/metatype 目录中包含您的服务的捆绑软件。
关于此任务
提供元数据来描述配置是可选的,但它的确具有以下优点:
- 缺省值可以与实现代码分离,并放入元类型 XML 文件,在该文件中可以很容易地找到缺省值;
- 可以为每个属性指定相应的数据类型和其他验证数据,从而允许使用配置解析器和开发者工具进行验证,并简化您编写用来处理这些属性的代码;
- 您的配置将包括在 XML 模式中,该模式描述可供开发者工具和其他实用程序使用的配置;
- 可以为每个属性提供可翻译的名称和描述,并且将在开发者工具中显示可翻译的名称和描述。
过程
- 在捆绑软件的 OSGI-INF/metatype 目录中创建 XML 文件,然后为 OSGi 元类型名称空间添加名称空间声明:
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0">
</metatype:MetaData>
- 添加对象类定义 (OCD) 元素以包含属性集,该元素具有标识及(可选)名称和描述。此外,还提供 Designate 元素,以将 OCD 映射到代码和 server.xml 文件中使用的 PID。
<OCD name="b2c" description="bundle two config" id="b2c-id">
</OCD>
<Designate pid="testBundleTwo">
<Object ocdref="b2c-id" />
</Designate>
- 在 OCD 中为每个配置属性添加属性定义 (AD) 元素。每个属性需要一个标识,该标识也用在 server.xml 文件中以及用来接收所注入配置的代码中。它可以选择性地具有可供开发者工具及其他图形工具使用的名称和描述。如果指定数据类型,那么允许运行时环境验证该类型的输入并简化代码的处理过程。如果指定有用的缺省值,那么允许用户提供的配置是最低配置,并包含已知配置中的所有配置缺省值:
<AD name="boolProperty" description="a boolean property" id="boolProp"
type="Boolean" default="false" />
- 然后,您具有以下 metatype.xml 文件。
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0" >
<OCD name="b2c" description="bundle two config" id="testBundleTwo-2-id">
<AD name="textProperty" description="a text property"
id="textProp" type="String" default="default string" />
<AD name="boolProperty" description="a boolean property"
id="boolProp" type="Boolean" default="false" />
<AD name="intProperty" description="an integer property"
id="intProp" type="Integer" default="14" />
</OCD>
<Designate pid="testBundleTwo-2">
<Object ocdref="testBundleTwo-2-id" />
</Designate>
</metatype:MetaData>
- 给服务编写代码以接收配置属性。如果没有元类型描述,那么所有属性都将作为 String 值提供,并且将加以处理,如下所示:
String textProp = (String) properties.get("textProp");
Boolean boolProp = Boolean.parseBoolean((String) properties.get("boolProp"));
int intProp = Integer.parseInt((String) properties.get("intProp"));
String textProp = (String) properties.get("textProp");
Boolean boolProp = (Boolean) properties.get("boolProp");
int intProp = (Integer) properties.get("intProp");
运行时环境将已经验证输入值是否为正确的类型。