每個服務的配置內容都可以用符合「OSGi Meta 類型服務」規格的 meta 資料來說明。
meta 資料可以包括預設值、可翻譯的名稱和說明,以及可供驗證輸入值的資訊。
會遵循規格,將產生的 XML 檔包裝在 OSGI-INF/metatype 目錄中的軟體組,其中含有您的服務。
關於這項作業
提供 meta 資料來說明配置是選用的,但它提供了以下好處:
- 預設值與實作程式碼分開,放在 meta 類型 XML 檔中,很方便找到它們:
- 可以為每個屬性指定適當的資料類型和其他驗證資料,以供配置剖析器及開發人員工具進行驗證,且簡化了您為處理屬性而撰寫的程式碼;
- 您的配置會併到說明開發人員工具及其他公用程式所能使用之配置的 XML 綱目中;
- 可以為每個屬性提供可翻譯的名稱和說明,其將顯示在開發人員工具中。
程序
- 在您的軟體組的 OSGI-INF/metatype 目錄中建立一個 XML 檔,然後新增「OSGi meta 類型」名稱空間的名稱空間宣告:
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0">
</metatype:MetaData>
- 新增一個物件類別定義 (OCD) 元素來包含一組屬性,以及 ID 及(選用)名稱和說明。
另外,也請提供一個 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) 元素。
每個屬性都需要一個 ID,在 server.xml 檔及接收注入之配置的程式碼中,也會用到這個 ID。
它可以選擇性地具備可供開發人員工具及其他圖形工具使用的名稱和說明。
指定資料類型可讓執行時期環境針對類型來驗證輸入,且可以簡化您的處理碼。
指定有用的預設值可以儘可能減少使用者所需提供的配置,且可以將所有配置預設值都放在一個已知的位置:
<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>
- 編寫您的服務來接收配置內容。
當沒有 meta 類型說明時,所有的內容都會提供為 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");
執行時期環境會驗證好輸入值的類型正確。