Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)

[目次][用語][索引][前へ][次へ]

2.4.6 リソース参照の名称

Java EE 6以降,リソース参照の名称には,java:comp/envを使用した名称のほかにJNDI完全修飾名を指定できます。リソース参照の名称にJNDI完全修飾名を指定することで,一つのアプリケーション内のすべてのコンポーネント(Enterprise Bean,サーブレット,JSP,フィルタ,およびリソースアダプタ)で共有されるリソース参照や,EJB-JARまたはWebアプリケーション内のすべてのコンポーネントで共有されるリソース参照を定義できます。

また,DD(web.xml)の<lookup-name>タグ,または@Resourceアノテーションや@EJBアノテーションのlookup属性を指定することで,ほかのリソース参照をJNDI完全修飾名でルックアップできます。

ここでは,リソース参照の名称へのJNDI完全修飾名の指定,およびほかのリソース参照のルックアップについて説明します。

注意
ejbserver.jndi.global.enabledパラメタにfalseを指定してPortable Global JNDI名の登録抑止をしている場合は,リソース参照の名称に「java:」で始まる名称を指定しないでください。
<この項の構成>
(1) リソース参照の名称へのJNDI完全修飾名の指定
(2) ほかのリソース参照のルックアップ

(1) リソース参照の名称へのJNDI完全修飾名の指定

アプリケーションサーバでは,Portable Global JNDI名の登録が有効な場合に,リソース参照の名称に「java:」から始まる名称を指定すると,JNDI完全修飾名が指定されたものと判断され,指定した名称がそのままJNDI名として扱われます。

Portable Global JNDI名の登録が無効な場合,または「java:」以外の文字列から始まる名称を指定した場合は,java:comp/envから始まる名称またはリソースアダプタの別名として扱われます。

DD(web.xml)で,リソース参照の名称にJNDI完全修飾名を指定できるリソース参照の種別を次の表に示します。

表2-16 JNDI完全修飾名を指定できるリソース参照の種別(DD)

項番 リソース参照の種別 リソース参照の名称を指定するタグ
1 環境エントリ <env-entry> - <env-entry-name>
2 リソース参照 <resource-ref> - <res-ref-name>
3 リソース環境変数参照 <resource-env-ref> - <resource-env-ref-name>
4 リモートEJB参照 <ejb-ref> - <ejb-ref-name>
5 ローカルEJB参照 <ejb-local-ref> - <ejb-local-ref-name>
6 永続化コンテキストの参照 <persistence-context-ref> - <persistence-context-ref-name>
7 永続化ユニットの参照 <persistence-unit-ref> - <persistence-unit-ref-name>

また,name属性にJNDI完全修飾名を指定できるリソース参照のアノテーションを次の表に示します。

表2-17 JNDI完全修飾名を指定できるリソース参照の種別(アノテーション)

項番 リソース参照の種別 リソース参照の名称を指定するアノテーション
1 環境エントリ @Resourceのname属性
2 リソース参照
3 リソース環境変数参照
4 リモートEJB参照 @EJBのname属性
5 ローカルEJB参照
6 永続化コンテキストの参照 @PersistenceContextのname属性
7 永続化ユニットの参照 @PersistenceUnitのname属性

Portable Global JNDI名の登録が有効な場合に,リソース参照の名称にJNDI完全修飾名を指定すると,指定する名前空間と,標準アプリケーション名や標準モジュール名が命名規則に反していないかの組み合わせによっては,アプリケーション開始時にKDJE47730-Eが出力され,アプリケーションの開始に失敗することがあります。

指定するJNDI完全修飾名の名前空間とアプリケーションの開始可否を次の表に示します。なお,「java:」から始まるが,指定できる名前空間ではない名称が指定された場合も,アプリケーション開始時にKDJE47730-Eが出力され,アプリケーションの開始に失敗します。

表2-18 指定するJNDI完全修飾名の名前空間とアプリケーションの開始可否

前提条件 指定する名前空間
リソース参照を定義したアプリケーションの標準アプリケーション名 リソース参照を定義したEJB-JARまたはWebアプリケーションの標準モジュール名 java:comp java:module java:app java:global
不正値または重複 × ×
正常 不正値または重複 ×
正常

(凡例)
○:アプリケーションを開始できる。
×:アプリケーションを開始できない。
−:該当なし。

アプリケーションサーバでは,リソース参照の名称をJNDI完全修飾名で指定する場合,サブコンテキストの名称に制限はありません。ただし,すでに同名でコンテキストまたはオブジェクトが登録済みの場合は,アプリケーション開始時にKDJE47721-Wが出力され,アプリケーションの開始に失敗します。

なお,リソース参照の名称にPortable Global JNDI名を定義した場合でも,そのリソース参照を別プロセスのJ2EEサーバやEJBクライアントアプリケーションからルックアップできません。Portable Global JNDI名が定義された別プロセス上のリソース参照をルックアップした場合,NameNotFoundException例外が発生します。

(2) ほかのリソース参照のルックアップ

アプリケーションサーバでは,java:comp/envから始まる名称で登録されたリソース参照に加え,web.xmlの<loolup-name>タグ,または@Resourceアノテーションや@EJBアノテーションのlookup属性を指定することで,EJB-JARまたはWebアプリケーション内で共有されるリソースやアプリケーション内で共有されるリソースについて,DIやリソース参照を介してルックアップできます。

例えば,Webアプリケーション内のweb.xmlで「java:app」名前空間に定義した環境エントリは,別のモジュールであるEJB-JAR内のEJBからもDIできます。

リソース参照からルックアップできる名称には,リソースアダプタの名称,EJBの別名が使用できます。

リソース参照からルックアップできる名称を次の表に示します。

表2-19 リソース参照からルックアップできる名称

ルックアップ元のリソース参照 ルックアップできる名称
アノテーション DD(web.xml)
@Resourceのlookup属性※1 <env-entry> - <lookup-name>※2 環境エントリの名称(JNDI完全修飾名)
<resource-ref> - <lookup-name>※1 リソース参照の名称(JNDI完全修飾名)
リソースアダプタの別名
<resource-env-ref> - <lookup-name>※1 リソース環境変数参照の名称(JNDI完全修飾名)
@EJBのlookup属性 <ejb-ref> - <lookup-name> EJBリモート参照の名称(JNDI完全修飾名)
EJBリモートオブジェクトのPortable Global JNDI名
EJBリモートオブジェクトの別名
<ejb-local-ref> - <lookup-name> ローカルEJB参照の名称(JNDI完全修飾名)
ローカルEJBオブジェクトのPortable Global JNDI名
ローカルEJBオブジェクトの別名

注※1
Java EEの仕様に従い,注入先のデータ型またはweb.xmlの<resource-ref-type>タグや<resource-env-ref-type>タグに設定されたデータ型が次のどれかの場合,@Resourceアノテーションのlookup属性または<lookup-name>タグの設定は無視されます(未設定時と同じ動作になります)。
org.omg.CORBA.ORB
org.omg.CORBA_2_3.ORB
javax.ejb.EJBContext
javax.ejb.SessionContext
javax.ejb.TimerService
javax.transaction.UserTransaction
javax.validation.Validator
javax.validation.ValidatorFactory
javax.enterprise.inject.spi.BeanManager

注※2
Java EEの仕様に従い,<env-entry-value>タグに値が設定されている場合,@Resourceアノテーションのlookup属性または<lookup-name>の設定は無視されます(未設定時と同じ動作となります)。

なお,属性ファイルの<linked-to>タグ,<linked-queue>タグ,<linked-adminobject>タグや,@ResourceアノテーションのmappedName属性が指定されている場合は,@Resourceアノテーションのlookup属性およびweb.xmlの<lookup-name>タグの設定は無視されます。

注意
ルックアップ先のリソース参照をルックアップ元自身にしたり,循環参照にしたりしないでください。循環参照となるようなリソース参照が定義された場合,アプリケーションからルックアップしたとき,またはDIが実行されたときに,無限再帰呼び出しとなりjava.lang.StackOverflowError例外が発生し,アプリケーションからの応答が返らなくなります。
循環参照となる例を次に示します。
<env-entry>
<env-entry-name>java:app/env/sample1</env-entry>
<lookup-name>java:app/env/sample2</env-entry>
</env-entry>
<env-entry>
<env-entry-name>java:app/env/sample2</env-entry>
<lookup-name>java:app/env/sample1</env-entry>
</env-entry>
この定義に対して,アプリケーションから「java:app/env/sample1」をルックアップすると,無限再帰呼び出しとなり,java.lang.StackOverflowError例外が発生します。