2.15.2 アノテーションまたはDDでの定義
インターセプタは,アノテーションで指定するか,DDまたは属性ファイルを使用してEJB-JARの属性として設定します。
(1) デフォルトインターセプタの定義
デフォルトインターセプタは,EJB-JARに含まれるすべてのコンポーネントに適用されるインターセプタです。ここでは,DDを使用したデフォルトインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してデフォルトインターセプタを設定する方法について説明します。
DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,デフォルトインターセプタの情報を指定できます。
<interceptor-binding>タグ下に指定する要素を次の表に示します。
タグ名 |
必須/任意 |
指定内容 |
---|---|---|
<description> |
任意 |
任意の情報を指定します。 |
<ejb-name> |
必須 |
"*"(ワイルドカード)を指定します。 |
<interceptor-class> |
必須 |
要素にインターセプタクラスのクラス名を指定します。 |
これ以外のタグで指定した要素の値は,反映されません。
デフォルトインターセプタを使用する場合のDDの記述例を次に示します。
<ejb-jar> …(略)… <assembly-descriptor> <interceptor-binding> <description xml:lang="en">Default Interceptor</description> <ejb-name>*</ejb-name> <interceptor-class>test.ejb30.MyDefaultIC</interceptor-class> <interceptor-class>test.ejb30.MyDefaultIC2</interceptor-class> </interceptor-binding> </assembly-descriptor> …(略)… </ejb-jar>
この記述例では,デフォルトインターセプタクラスとして,「test.ejb30.MyDefaultIC」と「test.ejb30.MyDefaultIC2」の二つのクラスを指定しています。
-
インターセプタクラスの指定規則
<interceptor-class>タグでのクラス名の指定方法は,EJB 3.0仕様に準じます。次の規則に従って指定してください。
-
一つの<interceptor-class>タグに指定できるインターセプタクラスのクラス名は一つです。
-
<interceptor-class>タグは複数記述できます。<interceptor-class>タグを複数記述した場合は,記述した順序でインターセプタが呼び出されます。
-
<interceptor-class>タグで指定したインターセプタクラスには,次に示すアノテーションを使用してインターセプタメソッドを指定できます。
・@AroundInvoke
・@PostConstruct
・@PreDestroy
アノテーションについての詳細は,マニュアル「アプリケーションサーバ リファレンス API編」の「2. アプリケーションサーバで使用するアノテーションおよびDependency Injection」を参照してください。
-
(2) クラスレベルインターセプタの定義
クラスレベルインターセプタは,指定したクラスに適用されるインターセプタです。ここでは,DDを使用したクラスレベルインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してクラスレベルインターセプタを設定する方法について説明します。
DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,クラスレベルインターセプタの情報を指定できます。
<interceptor-binding>タグ下に指定する要素を次の表に示します。
タグ名 |
必須/任意 |
指定内容 |
---|---|---|
<ejb-name> |
必須 |
EJB名を指定します。 |
<interceptor-class> |
必須 |
要素にインターセプタクラスのクラス名を指定します。 |
なお,<method>タグには要素を指定しません。
(3) メソッドレベルインターセプタの定義
メソッドレベルインターセプタは,指定したビジネスメソッドに適用されるインターセプタです。ここでは,DDを使用したメソッドレベルインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してメソッドレベルインターセプタを設定する方法について説明します。
DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,メソッドレベルインターセプタの情報を指定できます。
<interceptor-binding>タグ下に指定する要素を次の表に示します。
タグ名 |
必須/任意 |
指定内容 |
---|---|---|
<ejb-name> |
必須 |
EJB名を指定します。 |
<interceptor-class> |
必須 |
要素にインターセプタクラスのクラス名を指定します。 |
<method-name> |
必須 |
要素にメソッド名を指定します。 |
<method-params> |
任意 |
要素にメソッドの引数リストを指定します。 |
<method-name>タグにビジネスメソッドを指定し,<method-params>タグの指定値を省略した場合,または<method-params>タグに引数リストを指定した場合の,メソッドレベルインターセプタが定義されるビジネスメソッドの範囲を次の表に示します。なお,<method-name>タグに"*"(ワイルドカード)を指定した場合,メソッドレベルインターセプタの定義は使用されません。
<method-params>タグの指定値 |
メソッドレベルインターセプタが定義されるビジネスメソッドの範囲 |
---|---|
省略する |
メソッド名が完全一致したすべてのビジネスメソッドに対してインターセプタが定義されます。 |
引数リストを指定する |
メソッド名と引数リストが完全一致したビジネスメソッドに対してインターセプタが定義されます。 引数リストを指定した場合,アノテーションで指定した情報をDDで上書きできます。 |
-
メソッドレベルインターセプタの適用規則
ビジネスメソッドが実行される際に使用するメソッドレベルインターセプタの定義は,次の順序で決定されます。
-
実行するビジネスメソッドと,<method-name>タグに指定したメソッド名と<method-params>タグに指定した引数リストが完全一致する定義があれば,そのメソッドレベルインターセプタの定義が使用されます。
-
実行するビジネスメソッドと<method-name>タグに指定したメソッド名が一致し,<method-params>タグに引数リストを指定しない定義があれば,そのメソッドレベルインターセプタの定義が使用されます。
-
実行するビジネスメソッドと<method-name>タグに指定したメソッド名が一致するメソッドレベルインターセプタの定義がない場合,メソッドレベルインターセプタの定義は使用されません。
なお,実行するビジネスメソッドが,<method-name>タグに指定したメソッド名と<method-params>タグに指定した引数リストが完全一致する定義,および<method-name>タグに指定したメソッド名が一致し,<method-params>タグに引数リストを指定しない定義の両方に該当する場合は,メソッド名と引数リストが完全一致する定義が使用されます。
また,アノテーションで指定されたメソッドレベルインターセプタは,メソッド名と引数リストが完全一致する定義として扱われます。アノテーションで指定されたメソッドレベルインターセプタをDDで上書きする場合は,メソッド名と引数リストが完全一致する定義でDDに記載する必要があります。
-