17.4.2 @Resourceアノテーションを使用したリソースの参照解決
@Resourceアノテーションを使用してリソースの参照解決をする方法には,次の2種類があります。
-
name属性にリソースの別名を指定する方法
-
mappedName属性に参照先リソースを指定する方法
@Resourceアノテーションに属性を指定しない場合は,cosminexus.xmlまたはcosminexus.xml以外の属性ファイルによってリンクを解決する必要があります。ここでは,それぞれの方法について説明します。
- 〈この項の構成〉
(1) @Resourceアノテーションのname属性で指定する方法
@Resourceアノテーションのname属性にリソースの別名を指定します。
@Resourceアノテーションのname属性に指定できるリソースを次に示します。
-
javax.sql.DataSource
-
javax.jms.ConnectionFactory
-
javax.jms.QueueConnectionFactory
-
javax.jms.TopicConnectionFactory
-
javax.resource.cci.ConnectionFactory
コーディング例を次に示します。この例は,@Resourceアノテーションのname属性に別名「jdbc/ds」を設定する場合の例です。
package sample; @Stateless public class MySessionBean implements MySession { @Resource(name="jdbc/ds") public DataSource customerDB; ... }
@Resourceアノテーションのname属性にリソースアダプタの別名を指定した場合,参照解決が自動で実施されます。そのため,属性ファイルを編集する必要はありません。属性ファイルを取得した場合は,次のようになります。
<resource-ref> <description xml:lang="en"></description> <res-ref-name>jdbc/ds</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>sample.MySessionBean</injection-target-class> <injection-target-name>customerDB</injection-target-name> </injection-target> <linked-to></linked-to> </resource-ref>
(2) @ResourceアノテーションのmappedName属性で指定する方法
@ResourceアノテーションのmappedName属性にリソースの表示名やキュー表示名を指定します。
@ResourceアノテーションのmappedName属性に記述したリソース表示名が参照解決に使用されます。
コーディング例を次に示します。この例は,@ResourceアノテーションのmappedName属性にリソース表示名「DB_Connector_for_Oracle」を設定する場合の例です。
package sample; @Stateless public class MySessionBean implements MySession { @Resource(mappedName="DB_Connector_for_Oracle") public DataSource customerDB; ... }
ここでは,@Resourceのname属性を省略しているため,デフォルト値「クラス名/フィールド名」が使用されます。この場合のデフォルト値は「sample.MySessionBean/customerDB」となります。属性ファイルを取得した場合は,次のようになります。
<resource-ref> <description xml:lang="en"></description> <res-ref-name>sample.MySessionBean/customerDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <mapped-name>DB_Connector_for_Oracle</mapped-name> <injection-target> <injection-target-class>sample.MySessionBean</injection-target-class> <injection-target-name>customerDB</injection-target-name> </injection-target> <linked-to></linked-to> </resource-ref>
(3) cosminexus.xmlまたはそれ以外の属性ファイルで指定する方法
@Resourceアノテーションの属性を指定しない場合,cosminexus.xmlやcosminexus.xml以外の属性ファイルを使って参照解決をする必要があります。cosminexus.xml,またはcosminexus.xml以外の属性ファイルの<linked-to>に,リソースの表示名を指定します。参照先リソースがキューの場合は,<linked-queue>にリソースアダプタの表示名とキュー表示名を記述します。参照先リソースが管理対象オブジェクトの場合は,<linked-adminobject>にリソースアダプタの表示名と管理対象オブジェクト名を記述します。
コーディング例を次に示します。この例では,@Resourceアノテーションのname属性を省略しているため,別名としてデフォルト値の「クラス名/フィールド名」が使用されます。ここでは,「sample.MySessionBean/customerDB」が設定されます。
package sample; @Stateless public class MySessionBean implements MySession { @Resource public DataSource customerDB; ... }
cosminexus.xmlで参照解決をする場合は,<link-to>,<linked-queue>または<linked-adminobject>にリソースの表示名を指定してから,アプリケーションをインポートします。cosminexus.xml以外の属性ファイルで参照解決をする場合は,アプリケーションをインポートしたあとで,属性ファイル(アプリケーション統合属性ファイルなど)を取得します。取得した属性ファイルに,<linked-to><linked-queue>または<linked-adminobject>に参照先となるリソース表示名を記述します。
属性を設定したあとで属性ファイルを取得した場合は,次のようになります。
<resource-ref> <description xml:lang="en"></description> <res-ref-name> sample.MySessionBean/customerDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> <injection-target> <injection-target-class>sample.MySessionBean</injection-target-class> <injection-target-name>customerDB</injection-target-name> </injection-target> <linked-to>DB_Connector_for_Oracle</linked-to> </resource-ref>
(4) 参照解決方法の優先順位
@Resourceアノテーションを使用してリソースの参照解決をする場合に,複数の方法を同時に設定したときには,次の優先順位で設定が有効になります。
-
cosminexus.xmlまたはcosminexus.xml以外の属性ファイルによる設定
-
@ResourceアノテーションのmappedName属性の設定
-
@Resourceアノテーションのname属性の設定
J2EEリソースに異なる別名が同時に設定された場合に有効となる別名の設定について表に示します。
name属性の設定の有無※1 |
mappedName属性の設定の有無 |
属性ファイル※2の<linked-to>などの設定の有無 |
有効となる別名の設定※3 |
---|---|---|---|
あり |
あり |
あり |
属性ファイル※2の<linked-to>などの設定 |
なし |
@ResourceアノテーションのmappedName属性の設定 |
||
なし |
あり |
属性ファイル※2の<linked-to>などの設定 |
|
なし |
@Resourceアノテーションのname属性の設定 |
||
なし |
@Resourceアノテーションがフィールド・メソッドに指定されていればデフォルト値が使用されて,「あり」の場合と同様になります※4。 また,@Resourceアノテーションがクラスに指定された場合は,@Resourceアノテーションのname属性は省略できません。クラスに指定された@Resourceのname属性がない場合,アノテーションの読み込みに失敗して,インポート時にエラーになります。※5 |