2.15.2 アノテーションまたはDDでの定義

インターセプタは,アノテーションで指定するか,DDまたは属性ファイルを使用してEJB-JARの属性として設定します。

<この項の構成>
(1) デフォルトインターセプタの定義
(2) クラスレベルインターセプタの定義
(3) メソッドレベルインターセプタの定義

(1) デフォルトインターセプタの定義

デフォルトインターセプタは,EJB-JARに含まれるすべてのコンポーネントに適用されるインターセプタです。ここでは,DDを使用したデフォルトインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してデフォルトインターセプタを設定する方法について説明します。

DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,デフォルトインターセプタの情報を指定できます。

<interceptor-binding>タグ下に指定する要素を次の表に示します。

表2-46 DDを使用する場合に<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仕様に準じます。次の規則に従って指定してください。

(2) クラスレベルインターセプタの定義

クラスレベルインターセプタは,指定したクラスに適用されるインターセプタです。ここでは,DDを使用したクラスレベルインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してクラスレベルインターセプタを設定する方法について説明します。

DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,クラスレベルインターセプタの情報を指定できます。

<interceptor-binding>タグ下に指定する要素を次の表に示します。

表2-47 DDを使用する場合に<interceptor-binding>タグ下に指定する要素(クラスレベルインターセプタ)

タグ名必須/任意指定内容
<ejb-name>必須EJB名を指定します。
<interceptor-class>必須要素にインターセプタクラスのクラス名を指定します。

なお,<method>タグには要素を指定しません。

(3) メソッドレベルインターセプタの定義

メソッドレベルインターセプタは,指定したビジネスメソッドに適用されるインターセプタです。ここでは,DDを使用したメソッドレベルインターセプタを設定する方法,および実行環境でEJB-JAR属性ファイルを使用してメソッドレベルインターセプタを設定する方法について説明します。

DDで,<ejb-jar>タグ下の<interceptor-binding>タグを記述することで,メソッドレベルインターセプタの情報を指定できます。

<interceptor-binding>タグ下に指定する要素を次の表に示します。

表2-48 DDを使用する場合に<interceptor-binding>タグ下に指定する要素(メソッドレベルインターセプタ)

タグ名必須/任意指定内容
<ejb-name>必須EJB名を指定します。
<interceptor-class>必須要素にインターセプタクラスのクラス名を指定します。
<method-name>必須要素にメソッド名を指定します。
<method-params>任意要素にメソッドの引数リストを指定します。

<method-name>タグにビジネスメソッドを指定し,<method-params>タグの指定値を省略した場合,または<method-params>タグに引数リストを指定した場合の,メソッドレベルインターセプタが定義されるビジネスメソッドの範囲を次の表に示します。なお,<method-name>タグに"*"(ワイルドカード)を指定した場合,メソッドレベルインターセプタの定義は使用されません。

表2-49 メソッドレベルインターセプタが定義されるビジネスメソッドの範囲

<method-params>タグの指定値メソッドレベルインターセプタが定義されるビジネスメソッドの範囲
省略するメソッド名が完全一致したすべてのビジネスメソッドに対してインターセプタが定義されます。
引数リストを指定するメソッド名と引数リストが完全一致したビジネスメソッドに対してインターセプタが定義されます。
引数リストを指定した場合,アノテーションで指定した情報をDDで上書きできます。
●メソッドレベルインターセプタの適用規則

ビジネスメソッドが実行される際に使用するメソッドレベルインターセプタの定義は,次の順序で決定されます。

  1. 実行するビジネスメソッドと,<method-name>タグに指定したメソッド名と<method-params>タグに指定した引数リストが完全一致する定義があれば,そのメソッドレベルインターセプタの定義が使用されます。
  2. 実行するビジネスメソッドと<method-name>タグに指定したメソッド名が一致し,<method-params>タグに引数リストを指定しない定義があれば,そのメソッドレベルインターセプタの定義が使用されます。
  3. 実行するビジネスメソッドと<method-name>タグに指定したメソッド名が一致するメソッドレベルインターセプタの定義がない場合,メソッドレベルインターセプタの定義は使用されません。

なお,実行するビジネスメソッドが,<method-name>タグに指定したメソッド名と<method-params>タグに指定した引数リストが完全一致する定義,および<method-name>タグに指定したメソッド名が一致し,<method-params>タグに引数リストを指定しない定義の両方に該当する場合は,メソッド名と引数リストが完全一致する定義が使用されます。

また,アノテーションで指定されたメソッドレベルインターセプタは,メソッド名と引数リストが完全一致する定義として扱われます。アノテーションで指定されたメソッドレベルインターセプタをDDで上書きする場合は,メソッド名と引数リストが完全一致する定義でDDに記載する必要があります。