Liberty プロファイルで jndiReferenceEntry エレメントを使用することによって、
動的な値の参照をサーバー構成ファイルからデフォルト Java™ Naming and Directory Interface (JNDI) 名前空間にバインドできます。
このタスクについて
Liberty では、デフォルト JNDI 名前空間が使用可能であり、アプリケーションで必要とされる各種オブジェクトへのバインディングを提供します。サーバー内で使用可能なフィーチャーに基づいて、
事前決定したオブジェクトのセットをデフォルト JNDI 名前空間にバインドできます。それに加えて、
返す値を動的に決定するオブジェクト・ファクトリーに参照をバインドすることができます。このオブジェクト・ファクトリーを使用して、
カスタム・オブジェクト・タイプをアプリケーションに返すこともできます。
JNDI ネーミングついて詳しくは、『ネーミング』を参照してください。
手順
- jndi-1.0 Liberty フィーチャーを server.xml ファイルに追加します。
<featureManager>
<feature>jndi-1.0</feature>
</featureManager>
- プログラマチックに定義された値を返す ObjectFactory クラスを作成します。
import javax.naming.spi.ObjectFactory;
public class MyObjectFactory implements ObjectFactory {
@Override
public Object getObjectInstance(Object o, Name n, Context c, Hashtable<?, ?> envmt) throws Exception {
Properties p = new Properties();
p.put("abc", 123);
return p;
}
}
- server.xml ファイルで library エレメントに ObjectFactory を組み込みます。
<library id="objectFactoryLib">
<fileset dir="${server.config.dir}/lib" includes="factory.jar"/>
</library>
- server.xml ファイルで jndiObjectFactory エレメントにファクトリーを宣言し、
前に宣言されたライブラリーを参照します。
<jndiObjectFactory id="objectFactory" libraryRef="objectFactoryLib"
className="com.ibm.example.factory.MyObjectFactory"/>
ファクトリーが返すオブジェクトのタイプも宣言できます。タイプは javax.naming.Context.list() メソッドによって返されます。
<jndiObjectFactory id="objectFactory" libraryRef="objectFactoryLib"
className="com.ibm.example.factory.MyObjectFactory"
objectClassName="java.util.Properties"/>
- server.xml ファイルで jndiReferenceEntry エレメントにエントリーを宣言し、
前に宣言されたファクトリーを参照します。
<jndiReferenceEntry id="refEntry" jndiName="ref/entry" factoryRef="objectFactory"/>
- server.xml ファイルで jndiReferenceEntry エレメントのプロパティーをさらに宣言します。
<jndiReferenceEntry id="refEntry" jndiName="ref/entry" factoryRef="objectFactory">
<properties abc="123"/>
</jndiReferenceEntry>
これらの追加プロパティーは、ファクトリーに渡される javax.naming.Reference に javax.naming.StringRefAddr として表されます。
import javax.naming.spi.ObjectFactory;
public class MyObjectFactory implements ObjectFactory {
@Override
public Object getObjectInstance(Object o, Name n, Context c, Hashtable<?, ?> envmt) throws Exception {
Properties p = new Properties();
Reference ref = (Reference) o;
RefAddr refAddr = ref.get("abc");
p.put("abc", refAddr == null ? 123 : refAddr.getContent());
return p;
}
}
- リソース環境参照を使用することによって、結果のオブジェクトをアプリケーションに注入できます。
@Resource(name="ref/entry")
private Properties properties;