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完全修飾名の指定
アプリケーションサーバでは,Portable Global JNDI名の登録が有効な場合に,リソース参照の名称に「java:」から始まる名称を指定すると,JNDI完全修飾名が指定されたものと判断され,指定した名称がそのままJNDI名として扱われます。
Portable Global JNDI名の登録が無効な場合,または「java:」以外の文字列から始まる名称を指定した場合は,java:comp/envから始まる名称またはリソースアダプタの別名として扱われます。
DD(web.xml)で,リソース参照の名称にJNDI完全修飾名を指定できるリソース参照の種別を次の表に示します。
項番 |
リソース参照の種別 |
リソース参照の名称を指定するタグ |
---|---|---|
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完全修飾名を指定できるリソース参照のアノテーションを次の表に示します。
項番 |
リソース参照の種別 |
リソース参照の名称を指定するアノテーション |
---|---|---|
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が出力され,アプリケーションの開始に失敗します。
前提条件 |
指定する名前空間 |
||||
---|---|---|---|---|---|
リソース参照を定義したアプリケーションの標準アプリケーション名 |
リソース参照を定義した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の<lookup-name>タグ,または@Resourceアノテーションや@EJBアノテーションのlookup属性を指定することで,EJB-JARまたはWebアプリケーション内で共有されるリソースやアプリケーション内で共有されるリソースについて,DIやリソース参照を介してルックアップできます。
例えば,Webアプリケーション内のweb.xmlで「java:app」名前空間に定義した環境エントリは,別のモジュールであるEJB-JAR内のEJBからもDIできます。
リソース参照からルックアップできる名称には,リソースアダプタの名称,EJBの別名が使用できます。
リソース参照からルックアップできる名称を次の表に示します。
ルックアップ元のリソース参照 |
ルックアップできる名称 |
|
---|---|---|
アノテーション |
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オブジェクトの別名 |
なお,属性ファイルの<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例外が発生します。