Hitachi

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


17.4.2 @Resourceアノテーションを使用したリソースの参照解決

@Resourceアノテーションを使用してリソースの参照解決をする方法には,次の2種類があります。

@Resourceアノテーションに属性を指定しない場合は,cosminexus.xmlまたはcosminexus.xml以外の属性ファイルによってリンクを解決する必要があります。ここでは,それぞれの方法について説明します。

〈この項の構成〉

(1) @Resourceアノテーションのname属性で指定する方法

@Resourceアノテーションのname属性にリソースの別名を指定します。

@Resourceアノテーションのname属性に指定できるリソースを次に示します。

コーディング例を次に示します。この例は,@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アノテーションを使用してリソースの参照解決をする場合に,複数の方法を同時に設定したときには,次の優先順位で設定が有効になります。

  1. cosminexus.xmlまたはcosminexus.xml以外の属性ファイルによる設定

  2. @ResourceアノテーションのmappedName属性の設定

  3. @Resourceアノテーションのname属性の設定

J2EEリソースに異なる別名が同時に設定された場合に有効となる別名の設定について表に示します。

表17‒7 複数の方法を同時に設定した場合に有効となる参照先の設定

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

(凡例)

あり:アノテーションや属性ファイルで属性が設定されていることを示します。

なし:「なし」の場合の説明を次に示します。

  • @Resourceアノテーションのname属性および@ResourceアノテーションのmappedName属性そのものの記述がない場合を示します。または,cosminexus.xmlまたはcosminexus.xml以外の属性ファイルの<linked-to>のタグそのものがない場合を示します。

  • 属性またはタグに指定された値がない(空文字)場合を示します。

注※1 @Resourceアノテーションのname属性に対応する標準DDの<resource-ref>または<res-ref-name>にもリソースの別名を指定できます。@ResourceアノテーションのmappedName属性,および属性ファイルの<linked-to>などに指定がない場合は,標準DDの<resource-ref>または<res-ref-name>に指定した別名を持つリソースが参照先となります。

注※2 cosminexus.xmlおよびcosminexus.xml以外の属性ファイルが該当します。

注※3 別名の設定がない場合,アプリケーションの開始に失敗します。

注※4 @ResourceアノテーションのmappedName属性と属性ファイル(cosminexus.xmlおよびcosminexus.xml以外の属性ファイル)の<linked-to>などに指定がなく,name属性のデフォルト値,またはクラスに指定した@Resourceアノテーションのname属性の値とリソースの別名が一致した場合は,その別名を持つリソースが参照先となります。

注※5 mappedName属性と属性ファイル(cosminexus.xmlおよびcosminexus.xml以外の属性ファイル)の<linked-to>などに指定がなく,クラスに指定した@Resourceのname属性の値とリソースの別名が一致した場合は,その別名を持つリソースが参照先となります。