5 アノテーション付きEJBクラスのプログラミング
この章の内容は次のとおりです:
メタデータ・アノテーションとEJB Beanファイルの概要
WebLogic Server EJB 3.2プログラミング・モデルでは、Java EE 7メタデータ・アノテーション機能を使用して、アノテーション付きEJB 3.2 Beanファイルを作成し、標準Javaコンパイラでクラスをコンパイルします。生成されたクラスは、デプロイメント用のターゲット・モジュールにパッケージ化できます。実行時に、WebLogic Serverはアノテーションを解析して、必要な動作のアスペクトをBeanファイルに適用します。
ヒント:
デプロイメント時間の短縮化を図るために、WebLogicコンパイル・ツールweblogic.appc
(またはこれと同等のAntタスクwlappc
)を使用して、デプロイ可能なアーカイブ・ファイル(WAR、JARまたはEAR)をプリコンパイルしておくこともできます。weblogic.appc
でプリコンパイルをすると、特定のヘルパー・クラスが生成され、アプリケーションが仕様に準拠しているかどうかを確認するための妥当性チェックが実行されます。
アノテーション付き3.2 Beanファイルは、EJBの中核部分です。このファイルにはEJBの動作を決定するJavaコードが含まれています。3.2 Beanファイルは、EJBのビジネス・メソッドを形作るEJBビジネス・インタフェースを実装した通常のJavaクラス・ファイルです。このBeanファイルにJDKメタデータ・アノテーションを追加することで、EJBの構造や特性を指定し、EJBを文書化し、実行時の特別なサービス(ビジネス・レベルの拡張セキュリティ、特別なビジネス・ロジックなど)を提供します。
「メタデータ・アノテーションの機能別一覧」には、Beanファイル内で指定できるアノテーションを機能別にまとめてあります。これらのアノテーションには、以下の仕様に記述されているアノテーションが含まれます。
-
Enterprise JavaBeans 3.2仕様(JSR-345)(
http://jcp.org/en/jsr/summary?id=345
) -
Common Annotations for the Java Platform (JSR-250)(
http://www.jcp.org/en/jsr/detail?id=250
)
詳細は、「EJBメタデータ・アノテーション・リファレンス」を参照してください。これらのアノテーションのリファレンス情報をアルファベット順にまとめてあります。このトピックは、EJB 3.2を作成するための反復的な開発手順の一部です。詳細な開発手順については、「Enterprise JavaBeansの反復的な開発」を参照してください。
一般的なEJBの設計およびアーキテクチャの詳細は、次のドキュメントを参照してください。
-
Enterprise JavaBeansのWebサイト(
http://www.oracle.com/technetwork/java/ejb-141389.html
) -
Java EE 6プラットフォームの概要: パート3 (EJB Technology, Even Easier to Use)(
http://www.oracle.com/technetwork/articles/javaee/javaee6overview-part3-139660.html#ejbeasy
) -
Java EE 7チュートリアル(
http://docs.oracle.com/javaee/7/tutorial/index.html
)
Beanファイルのプログラミング: 要件およびEJB 2.xからの変更点
EJB 3.2 Beanクラス・ファイルをプログラミングする上での要件は、基本的にはEJB 2.xでの要件と同じです。この項では、Beanクラスの基本的な必須要件について簡単に説明し、EJB 2.xとEJB 3.2の要件の相違点について説明します。
Beanクラスをプログラミングする上での必須要件と任意要件の詳細は、『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』を参照してください。
Beanファイルの要件とEJB 2.xからの変更点
次に、EJB 3.2でBeanクラスをプログラミングする上での要件と、EJB 2.xの要件のうちEJB 3.2には適用されなくなったものをまとめます。
-
クラスにBeanタイプを指定する必要があります。通常は、以下のメタデータ・アノテーションのいずれかを使用して指定します。これらのアノテーションは、デプロイメント記述子を使用してオーバーライドすることもできます。
-
@javax.ejb.Stateless
-
@javax.ejb.Stateful
-
@javax.ejb.Singleton
-
@javax.ejb.MessageDriven
ノート:
Oracle Kodo JPA/JDOは、このリリースのWebLogic Serverでサポートされなくなりました。ただし、Oracle Kodoを使用している場合は、個別のドキュメントの3.0エンティティBean(
@javax.ejb.Entity
)のプログラミングの説明を参照してください。JPA 2.1をサポートするOracle TopLinkを使用することをお薦めします。Kodoでは、JPA 1.0のみをサポートします。詳細は、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください
-
-
BeanがセッションBeanである場合、Beanクラスで次のいずれかを実装できます。
-
インタフェースなしのローカル・クライアント・ビュー・タイプ。個別のローカル・ビジネス・インタフェースを必要とすることなくローカル・セッションBeanへのアクセスを提供して、EJBの開発を単純化しています。(EJB 3.2では、MDBもインタフェースなしのローカル・クライアント・ビューを使用できます。)
-
Beanのビジネス・インタフェースまたはBeanのビジネス・インタフェースのメソッド(存在する場合)。
-
-
セッションBeanに
javax.ejb.SessionBean
を実装する必要がなくなりました。つまり、ejbCreate()
やejbPassivate()
などのejbXXX()
メソッドを実装する必要がなくなりました。 -
ステートフル・セッションBeanに
java.io.Serializable
を実装する必要がなくなりました。 -
メッセージドリブンBeanに
javax.ejb.MessageDrivenBean
を実装する必要がなくなりました。
次の要件はEJB 2.xから変更されていませんが、念のため簡単にまとめておきます。
-
クラスは
public
として定義する必要があります。final
やabstract
として定義することはできません。クラスは最上位のクラスでなければなりません。 -
クラスには、パラメータを取らない
public
コンストラクタが必要です。 -
クラスに
finalize()
メソッドを定義することはできません。 -
BeanがメッセージドリブンBeanである場合は、Beanでサポートするメッセージング・タイプに必要なメッセージ・リスナー・インタフェース(またはそのメッセージ・リスナー・インタフェースのメソッド)を、Beanクラスに直接的または間接的に実装する必要があります。JMSの場合であれば、メッセージ・リスナー・インタフェースは
javax.jms.MessageListener
インタフェースになります。
Beanクラス・メソッドの要件
メソッドの要件はEJB 2.xから変更されていませんが、念のため簡単にまとめておきます。
セッションBeanクラスのメソッド(ビジネス・インタフェース・メソッドを実装するメソッド)の要件は以下のとおりです。
-
メソッドには任意の名前を付けることができます。
-
ビジネス・メソッドは
public
として宣言する必要があります。final
やstatic
として宣言することはできません。 -
セッションBeanのリモート・ビジネス・インタフェース(またはリモート・インタフェース)のビジネス・メソッドに対応するメソッドの場合は、引数や戻り値の型をRMI/IIOPの有効な型にする必要があります。
-
throws
句で任意のアプリケーション例外を定義できます。
メッセージドリブンBeanクラスのメソッドの要件は以下のとおりです。
-
メソッドには、メッセージ・リスナー・インタフェースのリスナー・メソッドを実装する必要があります。
-
メソッドは
public
として宣言する必要があります。final
やstatic
として宣言することはできません。
Beanファイルのプログラミング
以降の節では、アノテーション付きEJB 3.2クラス・ファイルをプログラミングする際に推奨されるステップについて説明します。
Beanファイルをプログラミングする際の一般的なステップ
次の手順では、EJBの3.2 Beanファイルをプログラミングする場合の一般的で基本的なステップを説明します。細かなステップは、どのような動作のEJBを作成するかによって異なります。
以降の節で使用するサンプル・コードについては、「Enterprise JavaBeansの単純なサンプル」を参照してください。
ビジネス・インタフェースとその他のインタフェースを指定する
EJB 3.x APIに記述されたセッションBeanのEJB 3.xローカルまたはリモート・クライアントは、そのビジネス・インタフェースを介してセッションBeanにアクセスします。ローカル・クライアントは、Beanクラスのすべてのパブリック・メソッドを公開するインタフェースなしのビューを介してセッションBeanにアクセスすることもできます。
ビジネス・インタフェースを指定する
EJB Beanクラスのビジネス・インタフェースを指定する方法は2つあります。
-
implements
Javaキーワードを使用してビジネス・インタフェースを明示的に実装します。 -
メタデータ・アノテーション(たとえば
javax.ejb.Local
やjavax.ejb.Remote
)を使用してビジネス・インタフェースを指定します。この場合は、Beanクラスに明示的にビジネス・インタフェースを実装する必要はありません。
通常、EJB Beanクラスに実装したインタフェースは、そのEJBのビジネス・インタフェースと見なされます。また、リモート・インタフェースであることを明示しない限り、ビジネス・インタフェースはローカル・インタフェースと見なされます。ビジネス・インタフェースをリモート・インタフェースとして明示するには、javax.ejb.Remote
アノテーションを使用するか、適切なEJBデプロイメント記述子を更新します。javax.ejb.Remote
およびjavax.ejb.Local
アノテーションは、ビジネス・インタフェース自体で指定することも、そのインタフェースを実装するBeanクラスで指定することもできます。
Beanクラスには、複数のインタフェースを実装できます。その場合(ただし、下に示すインタフェースは対象外)は、EJBのビジネス・インタフェースをjavax.ejb.Local
またはjavax.ejb.Remote
アノテーションを使用して明示的に指定する必要があります。指定する場所は、ビジネス・インタフェース自体でも、そのビジネス・インタフェースを実装するBeanクラスでも、適切なデプロイメント記述子でも構いません。
Beanクラスに複数のインタフェースが実装されているかどうかを判断する際、以下のインタフェースは対象外となります。
-
java.io.Serializable
-
java.io.Externalizable
-
javax.ejb
パッケージで定義されたすべてのインタフェース
次のコードの抜粋に、Beanクラスのビジネス・インタフェースを明示的に実装して指定する方法を示します。
public class ServiceBean implements Service
サンプル全体を見るには、「単純なビジネス・インタフェースを使用するステートレスEJBのサンプル」を参照してください
インタフェースなしのビューを指定する
ローカルのインタフェースなしのビューを公開するエンタープライズBeanへのクライアントのアクセスは、依存関係インジェクションまたはJNDIルックアップを介して実行されます。EJB 3.2では、MDBもインタフェースなしのローカル・クライアント・ビューを使用できます。
-
依存関係インジェクションを介してエンタープライズBeanのインタフェースなしのビューへの参照を取得するには、
javax.ejb.EJB
アノテーションを使用してエンタープライズBeanの実装クラスを指定します。@EJB ExampleBean exampleBean;
-
JNDIルックアップを介してエンタープライズBeanのインタフェースなしのビューへの参照を取得するには、javax.naming.InitialContextインタフェースのルックアップ・メソッドを使用します。
ExampleBean exampleBean = (ExampleBean) InitialContext.lookup("java:module/ExampleBean");
クライアントは、新しい演算子を使用してインタフェースなしのビューを使用するエンタープライズBeanの新しいインスタンスを取得することはありません。
WebLogic Server配布キットにバンドルされているインタフェースなしのクライアント・ビューを使用するサンプル・コードがあります。「EJB 3.1: 単純化されたインタフェースなしのプログラミングおよびWARファイルでのパッケージ化」および「EJB 3.2: メソッドのないリスナーを使用するメッセージドリブンBeanのサンプル」を参照してください。
インタフェースなしのクライアント・ビューの実装の詳細は、Java EE 7チュートリアル(http://docs.oracle.com/javaee/7/tutorial/index.html
)の「エンタープライズBean」の章のインタフェースなしのビューを使用したローカル・エンタープライズBeanへのアクセスに関する項を参照してください。
Beanタイプ(ステートレス、シングルトン、ステートフル、メッセージドリブン)を指定する
3.2 Beanクラスで必須となるメタデータ・アノテーションは、プログラミングするBeanのタイプを指定するアノテーション1つのみです。以下のアノテーションのうち、いずれか1つのみを指定する必要があります。
-
@javax.ejb.Stateless
- ステートレス・セッションBeanをプログラミングすることを指定します。 -
@javax.ejb.Singleton
- シングルトン・セッションBeanをプログラミングすることを指定します。 -
@javax.ejb.Stateful
- ステートフル・セッションBeanをプログラミングすることを指定します。 -
@javax.ejb.MessageDriven
- メッセージドリブンBeanをプログラミングすることを指定します。ノート:
Oracle Kodo JPA/JDOは、このリリースのWebLogic Serverでサポートされなくなりました。ただし、Oracle Kodoを使用している場合は、個別のドキュメントの3.0エンティティBean(
@javax.ejb.Entity
)のプログラミングの説明を参照してください。JPA 2.1をサポートするOracle TopLinkを使用することをお薦めします。Kodoでは、JPA 1.0のみをサポートします。詳細は、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください
必須ではありませんが、アノテーションの属性を指定すると、Beanタイプをより詳しく記述できます。たとえば、以下の属性はすべてのBeanタイプに設定できます。
-
name
- Beanクラスの名前です。デフォルト値は、未修飾のBeanクラス名です。 -
mappedName
- Beanの製品固有の名前です。 -
description
- Beanについての説明です。
メッセージドリブンBeanをプログラミングする場合は、以下の属性を指定することもできます。
-
messageListenerInterface
- メッセージ・リスナー・インタフェースを明示的に実装していない場合や、Beanに追加のインタフェースを実装する場合に、メッセージ・リスナー・インタフェースを指定します。 -
activationConfig
- アクティブ化構成の名前と値のペアの配列を指定します。この配列は、Beanを操作環境で構成するために使用します。
次のコードの抜粋に、Beanがステートレス・セッションBeanであることを指定する方法を示します。
@Stateless public class ServiceBean implements Service
サンプル全体を見るには、「単純なビジネス・インタフェースを使用するステートレスEJBのサンプル」を参照してください
変数またはセッター・メソッドにリソース依存性を注入する
「依存関係インジェクション」では、Beanコンテキスト内のリソースや他の環境エントリを元に、EJBコンテナによってBeanの変数またはセッター・メソッドが自動的に提供(または「注入」)されます。依存関係インジェクションは、javax.ejb.EJBContext
インタフェースまたはJNDI APIを使用したリソースのルックアップを、より簡単にプログラミングするための方法にすぎません。
依存関係インジェクションを指定するには、注入するリソースのタイプに応じて、以下のアノテーションのいずれかを変数またはセッター・メソッドに追加します。
-
@javax.ejb.EJB
- 別のEJBへの依存性を指定します。 -
@javax.annotation.Resource
- 外部リソース(JDBCデータ・ソース、JMS宛先、接続ファクトリなど)への依存性を指定します。ノート:
このアノテーションは、EJB固有のものではありません。さまざまなJava EEコンポーネントで使用するメタデータ・アノテーションの共通セットの一部です。
これらのアノテーションには、複数のリソースへの依存性を指定するため、それぞれに相当するグループ化アノテーション(@javax.ejb.EJBs
および@javax.annotation.Resources
)があります。
必須ではありませんが、これらの依存性アノテーションに属性を指定すると、依存するリソースを明示的に記述できます。指定する必要のある情報の量は、その使用コンテキストと、EJBコンテナがそのコンテキストからどの程度の情報を推測できるかによって異なります。これらの属性の詳細と、どのような場合に使用すべきかについては、「javax.ejb.EJB」および「javax.annotation.Resource」を参照してください。
次のコード・スニペットでは、@javax.ejb.EJB
アノテーションを使用して、EJBへの依存関係を変数に注入する方法を示します。ここでは、Beanファイル内の関連する部分のみを示します。
package examples; import javax.ejb.EJB; ... @Stateful public class AccountBean implements Account { @EJB(beanName="ServiceBean") private Service service; ... public void sayHelloFromAccountBean() { service.sayHelloFromServiceBean(); }
この例では、プライベート属性service
に@javax.ejb.EJB
アノテーションを付けて、Bean名ServiceBean
でEJBへの参照を作成しています。サービス変数のデータ型はService
です。これは、ServiceBean
Beanクラスが実装するビジネス・インタフェースです。EJBコンテナは、AccountBean
EJBを作成し、即座にServiceBean
への参照をservice
変数に注入します。これにより、この変数から、SessionBean
のすべてのビジネス・メソッドに直接アクセスできるようになります。その結果、例に示されているように、sayHelloFromAccountBean
メソッド実装でsayHelloFromServiceBean
メソッドを呼び出すことが可能になります。
3.0エンティティを呼び出す
この節では、セッションBean内から3.0エンティティを呼び出して更新する方法について説明します。
ノート:
Oracle TopLink (JPA 2.1永続性プロバイダ)は、前のリリースのデフォルト・プロバイダのKodoに取ってかわり、デフォルトのJPAプロバイダになっています。persistence.xml
でJPAプロバイダが指定されていないアプリケーションでは、デフォルトでTopLinkが使用されます。詳細は、「Oracle WebLogic Serverでの永続性プロバイダの構成」を参照してください。
エンティティとは、データ・ストア・レコードを表す永続オブジェクトです。通常、エンティティのインスタンスは、データベース表の単一の行を表します。エンティティを使用すると、永続ストア内の情報の問合せや更新を、Java EEコンポーネント内(セッションBeanなど)から簡単に行えます。たとえば、Person
エンティティであれば、name
、address
、age
などのフィールドを含み、それぞれのフィールドがデータベース内の表の列に対応します。javax.persistence.EntityManager
オブジェクトを使用してエンティティにアクセスして管理する場合、一意のIDまたはSQL問合せを使用してPerson
レコードを簡単に取得でき、情報を変更した場合はその情報が基底のデータ・ストアに自動的に送信されます。
以下の節では、セッションBeanをエンティティと対話させるために必要な一般的なプログラミング・タスクについて説明します。
メタデータ・アノテーションを使用して永続性コンテキストを注入する
セッションBeanでは、以下のメタデータ・アノテーションを使用して、変数にエンティティ情報を注入できます。
-
@javax.persistence.PersistenceContext
- 永続性コンテキストをjavax.persistence.EntityManager
データ型の変数に注入します。「永続性コンテキスト」は単なるエンティティのセットで、1つの永続IDに1つの一意のエンティティ・インスタンスが対応します。persistence.xml
ファイル内に、セッションBeanで使用できる永続性コンテキストを定義して名前を付けます。 -
@javax.persistence.PersistenceContexts
- 複数の永続性コンテキストのセットを指定します。 -
@javax.persistence.PersistenceUnit
- 永続性コンテキストをjavax.persistence.EntityManagerFactory
データ型の変数に注入します。 -
@javax.persistence.PersistenceUnits
- 複数の永続性コンテキストのセットを指定します。
@PersistenceContext
アノテーションと@PersistenceUnit
アノテーションは、ほとんど同じ機能(変数に永続性コンテキスト情報を注入する)を果たします。大きな違いは、情報の注入先となるインスタンスのデータ型です。セッションBean内のEntityManager
のライフサイクルを完全に制御したい場合は、@PersistenceUnit
を使用してEntityManagerFactory
インスタンスに注入し、EntityManager
を手動で作成するためのコードを記述します。処理が完了したら、リソースを解放するために破棄します。EntityManager
のライフサイクルをEJBコンテナで管理したい場合は、@PersistenceContext
アノテーションを使用してEntityManager
に直接注入します。
次の例では、永続性コンテキストをEntityManager
データ型の変数em
に注入する方法を示します。該当するコードは太字で示してあります。
package examples; import javax.ejb.Stateless; import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; @Stateless public class ServiceBean implements Service { @PersistenceContext private EntityManager em; ...
EntityManager APIを使用してエンティティを検索する
EntityManager
オブジェクトをいったんインスタンス化したら、そのメソッドを使用して永続性コンテキスト内のエンティティと対話できます。この節では、エンティティのライフサイクルを特定および管理するメソッドについて説明します。EntityManager
のその他の用途(トランザクション管理、キャッシュ処理など)については、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。
ノート:
この節では、理解しやすいように、エンティティがデータベース表の実際の行を表すように構成されているものとします。
EntityManager.find()
メソッドを使用すると、表内の行をその主キーに基づいて検索できます。find
メソッドは2つのパラメータをとります。1つは問合せするエンティティ・クラス(たとえばPerson.class
)、もう1つは取得する特定の行の主キーの値です。行を取得したら、標準のgetXXX
メソッドを使用して、エンティティの特定のプロパティを取得できます。次のコードの抜粋に、主キーの値が10
のPerson
を検索してその住所を取得する方法を示します。
public List<Person> findPerson () {
Person p = em.find(Person.class, 10);
Address a = p.getAddress();
Query q = em.createQuery("select p from Person p where p.name = :name");
q.setParameter("name", "Patrick");
List<Person> l = (List<Person>) q.getResultList();
return l;
}
この例では、EntityManager.createQuery()
メソッドを使用して、カスタムSQL問合せを含むQuery
オブジェクトを作成する方法も示されています。この方法は、表の主キーだけで問合せできるEntityManager.find()
メソッドとは対照的です。この例では、表内のPatrick
という名前のPerson
をすべて問合せし、行の結果セットをList<Person>
オブジェクトに設定して呼出し側のメソッドfindPerson()
に返しています。
EntityManagerを使用してエンティティを作成および更新する
新しいエンティティ・インスタンスを作成する(つまり、データベースに新しい行を追加する)には、EntityManager.persist
メソッドを使用します。次にコードの抜粋を示します。
@TransactionAttribute(REQUIRED) public Person createNewPerson(String name, int age) { Person p = new Person(name, age); em.persist(p); // register the new object with the database Address a = new Address(); p.setAddress(a); em.persist(a); // depending on how things are configured, this may or // may not be required return p; }
ノート:
エンティティの作成および更新は、常にトランザクション内から行う必要があります。この例で、@TransactionAttribute
アノテーションがREQUIRED
に設定されているのはそのためです。
前述の例では、createNewPerson
メソッドに渡されたパラメータに基づいて新しいPersonを作成する方法を示しています。その後、EntityManager.persist
メソッドを呼び出すことで、行がデータベース表に自動的に追加されます。
例では、新しく作成したPerson
エンティティ(つまり、新しい表行)のAddress
を、setAddress()
エンティティ・メソッドを使用して更新する方法も示されています。Person
エンティティのカスケード構成によっては、2番目のpersist()
呼出しが不要な場合もあります。これは、データベースへの更新が、setAddress()
メソッドによって自動的にトリガーされる場合があるためです。カスケード処理の詳細は、「Oracle WebLogic ServerでのOracle TopLinkの使用方法」を参照してください。
EntityManager.find()
メソッドを使用してエンティティ・インスタンスを検索し、setXXX
メソッドを使用してエンティティのプロパティを変更する場合は、データベースが自動的に更新されるため、 EntityManager.persist()
メソッドを明示的に呼び出す必要はありません。次のコード・スニペットを参照してください。
@TransactionAttribute(REQUIRED) public Person changePerson(int id, int newAge) { Person p = em.find(Person.class, id); p.setAge(newAge); return p; }
この例では、Person.setAge()
メソッドの呼出しによって、データベース表内の適切な行への更新が自動的にトリガーされています。
EntityManager.merge()
メソッドを使用すると、クライアントによるエンティティの更新に基づいて、データベース表内の行をすばやく簡単に更新できます。次に例を示します。
@TransactionAttribute(REQUIRED) public Person applyOfflineChanges(Person pDTO) { return em.merge(pDTO); }
この例のapplyOfflineChanges()
メソッドはセッションBeanのビジネス・メソッドで、パラメータとしてセッションBeanクライアントによって作成済みのPerson
を取ります。このPerson
をEntityManager.merge()
メソッドに渡すと、EJBコンテナが自動的にデータベース表の既存の行を検索し、その行を新しいデータで更新します。更新後には、merge()
メソッドによってその行のコピーが返されます。
ビジネス・メソッドまたはライフサイクル・コールバック・イベントのインターセプタを指定する
インターセプタは、ビジネス・メソッドの呼出しやライフサイクル・コールバック・イベントをインターセプトするメソッドです。インターセプタ・メソッドには、ビジネス・メソッドをインターセプトするメソッドと、ライフサイクル・コールバック・メソッドをインターセプトするメソッドの2種類があります。
インターセプタは、セッションBeanおよびメッセージドリブンBeanに指定できます。
インターセプタ・メソッドは、Beanクラス自体の中でプログラミングできますが、Beanクラスとは別にインターセプタ・クラスをプログラミングして@javax.interceptor.Interceptors
アノテーションでBeanクラスに関連付けることもできます。特定の順序でチェーンとして実行する複数のインターセプタ・メソッドを作成できます。
インターセプタ・インスタンスには状態を保持できます。インターセプタ・インスタンスのライフサイクルは、それが関連付けられているBeanインスタンスのライフサイクルと同じです。インターセプタからは、JNDI、JDBC、JMS、他のエンタープライズBean、およびEntityManagerを呼び出すことができます。インターセプタ・メソッドでは、その呼出しの対象となったBeanのJNDIネーム・スペースが共有されます。エンタープライズBeanのコンポーネントに適用する制約をプログラミングすると、それがインターセプタにも適用されます。
インターセプタは、javax.interceptor
パッケージのメタデータ・アノテーションを使用して構成します。構成方法については後ほど説明します。
以下の節では、Beanクラスのインターセプタを実際にプログラミングする方法について説明します。
ビジネス・インターセプタまたはライフサイクル・インターセプタを指定する:一般的なステップ
次に示す手順は、Beanクラスのインターセプタを指定してプログラミングする一般的なステップです。
インターセプタを指定しているサンプルについては「単純なステートフルEJBのサンプル」を、インターセプタ・クラスのプログラミングのサンプルについては「インターセプタ・クラスのサンプル」を参照してください。
-
インターセプタ・メソッドを、Beanクラス内でプログラミングするか、別のインターセプタ・クラス内でプログラミングするかを決めます。
-
インターセプタ・メソッドを別のインターセプタ・クラス内でプログラミングする場合は、次の手順に従います。
-
「インターセプタ・クラスをプログラミングする」の説明に従ってクラスをプログラミングします
-
Beanクラスでは、
@javax.interceptor.Interceptors
アノテーションを使用して、インターセプタ・クラスをBeanクラスに関連付けます。インターセプタ・クラス内のメソッドには、@javax.interceptor.AroundInvoke
アノテーションを付けます。これで、そのBeanクラスのビジネス・メソッド・インターセプタ・メソッドになります。同様に、ライフサイクル・コールバック・アノテーションを付けたメソッドは、そのBeanクラスのライフサイクル・コールバック・インターセプタ・メソッドになります。
1つのBeanクラスに指定できるインターセプタ・クラスの数に制限はありません。複数のインターセプタ・クラスを指定した場合は、アノテーションに記述されている順序で実行されます。インターセプタ・クラスをクラス・レベルで指定した場合、インターセプタ・メソッドは適切なすべてのBeanクラス・メソッドに適用されます。インターセプタ・クラスをメソッド・レベルで指定した場合は、アノテーションを付けたメソッドにのみ適用されます。
-
-
インターセプタ・メソッドをプログラミングしたクラス(Beanクラスまたはインターセプタ・クラス)で、「ビジネス・メソッド・インターセプタ・メソッドをプログラミングする」の説明に従ってビジネス・メソッド・インターセプタ・メソッドをプログラミングします
-
インターセプタ・メソッドをプログラミングしたクラス(Beanクラスまたはインターセプタ・クラス)で、「ライフサイクル・コールバック・インターセプタ・メソッドをプログラミングする」の説明に従ってライフサイクル・コールバック・インターセプタ・メソッドをプログラミングします
-
必要に応じ、Beanクラス内でメソッドに
@javax.interceptor.ExcludeClassInterceptors
アノテーションを付けて、クラス・レベルで定義したインターセプタを除外します。 -
必要に応じ、Beanクラス内でクラスまたはメソッドに
@javax.interceptor.ExcludeDefaultInterceptors
アノテーションを付けて、後で定義する可能性のあるデフォルト・インターセプタを除外します。デフォルト・インターセプタは、ejb-jar.xml
デプロイメント記述子で構成します。アノテーションを使用して明示的に除外しない限り、JARファイル内のすべてのEJBに適用されます。 -
必要に応じ、「デフォルト・インターセプタ・メソッドを指定する」の説明に従って、EJB JARファイル全体に適用されるデフォルト・インターセプタを指定します
インターセプタ・クラスをプログラミングする
インターセプタ・クラスは、インターセプタ・アノテーションを含むプレーンJavaクラスです。インターセプタ・アノテーションによって、どのメソッドでビジネス・メソッドやライフサイクル・コールバック・メソッドをインターセプトするかを指定します。
インターセプタ・クラスでは、依存関係インジェクションがサポートされます。依存関係インジェクションは、インターセプタ・クラス・インスタンスの作成時に、関連付けられているエンタープライズBeanのネーミング・コンテキストを使用して実行されます。
インターセプタ・クラスには、引数を取らないパブリック・コンストラクタを含める必要があります。
インターセプタ・クラスに含めるメソッドの数に制限はありませんが、インターセプタ・アノテーションを付けることのできるメソッドの数に上限があるためその制約を受けます。この点については、以降の節で説明します。
サンプルについては、「インターセプタ・クラスのサンプル」を参照してください
ビジネス・メソッド・インターセプタ・メソッドをプログラミングする
ビジネス・メソッド・インターセプタ・メソッドを指定するには、メソッドに@AroundInvoke
アノテーションを付けます。
@AroundInvoke
アノテーションを付けたメソッドは、インターセプタ・クラスまたはBeanクラスごとに1つしか指定できません。1つのビジネス・メソッドに対して複数のインターセプタ・メソッドを指定するには、Beanファイル自体の中にインターセプタ・メソッドを指定した上で(この指定は省略可能)、複数のインターセプタ・クラスをBeanファイルに関連付ける必要があります。インターセプタ・メソッドが実行される順序は、関連付けられたインターセプタ・クラスを@Interceptor
アノテーション内で指定する順序によって決まります。Beanファイル自体の中に指定したインターセプタ・メソッドは、インターセプタ・クラス内に定義されたメソッドの後に実行されます。
ビジネス・メソッド自体に@AroundInvoke
アノテーションを付けることはできません。
@AroundInvoke
メソッドのシグネチャは次のようになっている必要があります。
Object <METHOD>(InvocationContext) throws Exception
@AroundInvoke
アノテーションを付けたメソッドは、常にInvocationContext.proceed()
を呼び出すようにするか、ビジネス・メソッドや後続の@AroundInvoke
メソッドが呼び出されないようにする必要があります。InvocationContext
APIの詳細については、「InvocationContext APIを使用してインターセプタ間で状態を保存する」を参照してください。
ビジネス・メソッド・インターセプタ・メソッドの呼出しは、対象となるビジネス・メソッドと同じトランザクションおよびセキュリティ・コンテキストの中で発生します。ビジネス・メソッド・インターセプタ・メソッドからは、ビジネス・メソッドのthrows
句で許可されている実行時例外やアプリケーション例外が送出されることがあります。
サンプルについては、「インターセプタ・クラスのサンプル」を参照してください
非同期ビジネス・メソッドをプログラミングする
セッションBeanでは、非同期メソッド、ビジネス・メソッドを実装できます。これらのメソッドでは、そのメソッドがセッションBeanインスタンスで呼び出される前にエンタープライズBeanコンテナによってクライアントに制御が戻されます。これに続き、クライアントでは、Java SEの並行処理APIを使用して、結果の取得、呼出しの取消し、例外のチェックを実行できます。通常、非同期メソッドは、メソッドの呼出し結果が即座に必要でない場合に、アプリケーションのスループット向上やレスポンス時間短縮の方法として、長時間実行される処理、プロセッサ負荷の高いタスク、バックグラウンド・タスクに対して使用します。
非同期ではない通常のビジネス・メソッドをセッションBeanクライアントが呼び出した場合、メソッドが完了するまでクライアントには制御が戻りません。一方、クライアントで非同期メソッドを呼び出した場合は、エンタープライズBeanコンテナによってクライアントにただちに制御が戻されます。そのため、クライアントではメソッドの呼出しが完了するまでの間、他のタスクを実行できます。メソッドが結果を返す場合、その結果はjava.util.concurrent.Future<V>
インタフェースの実装になります。「V」は結果値の型です。Future<V>
インタフェースには、クライアントで使用するメソッドが定義されており、これらのメソッドを使用して、計算の完了状態のチェック、呼出し完了までの待機、最終結果の取得、呼出しの取消しを実行できます。
非同期メソッド呼出しのセマンティクスは、インタフェースなしのローカル・ビジネス・クライアント・ビューおよびリモート・クライアント・ビューのみに適用されます。EJB 2.xローカル、EJB 2.xリモート、およびWebサービス・クライアント・ビューを介して公開されるメソッドは、非同期として指定しないでください。
非同期ビジネス・メソッドの作成方法の詳細は、Java EE 7チュートリアル(http://docs.oracle.com/javaee/7/tutorial/index.html
)の「エンタープライズBean」の章の非同期メソッドの呼出しに関する項を参照してください。
ライフサイクル・コールバック・インターセプタ・メソッドをプログラミングする
ライフサイクル・コールバック・インターセプタ・メソッドとして指定したメソッドは、EJBコンテナからライフサイクル・イベントの通知を受信できます。ライフサイクル・イベントには、Beanインスタンスの作成、パッシブ化、破棄などがあります。
ライフサイクル・コールバック・インターセプタ・メソッドには任意の名前を付けることができます。この点は、メソッドの名前をejbCreate()
やejbPassivate()
などにしなければならなかったEJB 2.xプログラミング・モデルとは異なります。
メソッドをライフサイクル・コールバック・インターセプタ・メソッドとして指定するには、以下のライフサイクル・インターセプタ・アノテーションを使用します。
-
@javax.ejb.PrePassivate
- EJBコンテナがステートフル・セッションBeanをパッシブ化する直前に通知を受信するメソッドを指定します。 -
@javax.ejb.PostActivate
- EJBコンテナがステートフル・セッションBeanを再アクティブ化した直後に通知を受信するメソッドを指定します。 -
@javax.annotation.PostConstruct
- EJBコンテナが1番目のビジネス・メソッドを呼び出す前と、依存関係インジェクションを完了した後に通知を受信するメソッドを指定します。通常、このアノテーションは、初期化を実行するメソッドに適用します。ノート:
このアノテーションは、
javax.ejb
パッケージではなく、javax.annotation
パッケージに含まれています。 -
@javax.annotation.PreDestroy
- EJBコンテナがBeanインスタンスを破棄する直前に通知を受信するメソッドを指定します。通常、このアノテーションは、Beanクラスが保持しているリソースを解放するメソッドに適用します。ノート:
このアノテーションは、
javax.ejb
パッケージではなく、javax.annotation
パッケージに含まれています。
上に挙げたアノテーションは、メソッドがBeanクラス内にあるか別のインターセプタ・クラス内にあるかに関係なく同じ方法で使用します。1つのメソッドに複数のアノテーションを付けることもできます。
また、Beanクラス内または関連付けられたインターセプタ・クラス内に、ライフサイクル・コールバック・アノテーションのサブセットや組み合わせを指定することも可能です。ただし、1つのクラス内に、同じコールバック・アノテーションを複数回指定することはできません。1つのクラス内に複数のコールバック・アノテーションを指定した場合、そのEJBはデプロイされません。
1つのライフサイクル・コールバック・イベントに対して複数のインターセプタ・メソッドを指定するには、Beanファイル自体の中にライフサイクル・コールバック・インターセプタ・メソッドを指定した上で(この指定は省略可能)、複数のインターセプタ・クラスをBeanファイルに関連付ける必要があります。インターセプタ・メソッドが実行される順序は、関連付けられたインターセプタ・クラスを@Interceptor
アノテーション内で指定する順序によって決まります。Beanファイル自体の中に指定したインターセプタ・メソッドは、インターセプタ・クラス内に定義されたメソッドの後に実行されます。
アノテーションを付けたメソッドのシグネチャは、メソッドをどこで定義したかによって異なります。
-
Beanクラスで定義したライフサイクル・コールバック・メソッドのシグネチャは次のようになります。
void <METHOD>()
-
インターセプタ・クラスで定義したライフサイクル・コールバック・メソッドのシグネチャは次のようになります。
void <METHOD>(InvocationContext)
InvocationContext
APIの詳細については、「InvocationContext APIを使用してインターセプタ間で状態を保存する」を参照してください。
ライフサイクル・インターセプタ・クラスをプログラミングする際のその他の要件については、「javax.ejb.PostActivate」、「javax.ejb.PrePassivate」、「javax.annotation.PostConstruct」、および「javax.annotation.PreDestroy」を参照してください。
サンプルについては、「インターセプタ・クラスのサンプル」を参照してください
デフォルト・インターセプタ・メソッドを指定する
デフォルト・インターセプタ・メソッドは、特定のEJB JARファイル内または展開されたディレクトリ内のすべてのコンポーネントに適用されます。したがって、必ずejb-jar.xml
デプロイメント記述子で構成する必要があり、メタデータ・アノテーションは特定のEJBにしか適用されないため使用できません。
デフォルト・インターセプタ・メソッドが設定されている場合、EJBコンテナは、EJBに対して定義されている他のすべてのインターセプタ(ビジネスおよびライフサイクルの両方)を呼び出す前に、このデフォルト・インターセプタ・メソッドを呼び出します。特定のEJBでデフォルト・インターセプタが呼び出されないようにするには、Beanファイルでクラス・レベルの@javax.interceptor.ExcludeDefaultInterceptors
アノテーションを指定します。
ejb-jar.xml
ファイルでは、<assembly-descriptor>
の<interceptor-binding>
子要素を使用してデフォルト・インターセプタを指定します。具体的には、<ejb-name>
子要素を*
に設定してそのクラスがすべてのEJBに適用されるようにしてから、<interceptor-class>
子要素をインターセプタ・クラスの名前に設定します。
次のejb-jar.xml
からの抜粋に、デフォルト・インターセプタ・クラスorg.mycompany.DefaultIC
を指定する方法を示します。
<?xml version="1.0" encoding="UTF-8"?> <ejb-jar version="3.2" xmlns="xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/ejb-jar_3_2.xsd"> ... <assembly-descriptor> ... <interceptor-binding> <ejb-name>*</ejb-name> <interceptor-class>org.mycompany.DefaultIC</interceptor-class> </interceptor-binding> </assembly-descriptor> </ejb-jar>
InvocationContext APIを使用してインターセプタ間で状態を保存する
javax.interceptor.InvocationContext
APIを使用すると、特定のビジネス・メソッドまたはライフサイクル・コールバックに対して実行するインターセプタ間で状態情報をやり取りできます。EJBコンテナは、同じInvocationContext
インスタンスを各インターセプタ・メソッドに渡します。したがって、たとえばビジネス・メソッド・インターセプタ・メソッドを初めて実行したときの情報を保存しておき、このビジネス・メソッドに対して実行する後続のインターセプタ・メソッドにこの情報を渡すことができます。InvocationContext
インスタンスは、ビジネス・メソッド呼出しやライフサイクル・コールバック呼出しの間では共有されません。
すべてのインターセプタ・メソッドは、InvocationContext
パラメータを取る必要があります。これにより、InvocationContext
インタフェースのメソッドを使用して、コンテキスト情報を取得したり設定したりすることが可能になります。次に、InvocationContext
インタフェースを示します。
public interface InvocationContext { public Object getBean(); public Method getMethod(); public Object[] getParameters(); public void setParameters(Object[]); public java.util.Map getContextData(); public Object proceed() throws Exception; }
getBean
メソッドは、Beanインスタンスを返します。getMethod
メソッドは、呼び出されたインターセプタ・メソッドが対象とするビジネス・メソッドの名前を返します。ライフサイクル・コールバック・インターセプタ・メソッドの場合はnullを返します。
proceed
メソッドは、チェーン内の次のインターセプタ・メソッドの呼出しを発生させます。チェーン内の最後の@AroundInvoke
インターセプタ・メソッドから呼び出された場合は、ビジネス・メソッド自体の呼出しを発生させます。
InvocationContext
を使用しているサンプルについては、「インターセプタ・クラスのサンプル」を参照してください
アプリケーション例外をプログラミングする
ビジネス・インタフェースにアプリケーション例外を送出するメソッドを指定した場合は、その例外をBeanクラスとは別のクラスとしてプログラミングする必要があります。
@javax.ejb.ApplicationException
アノテーションを使用すると、例外クラスがEJBのビジネス・メソッドによって送出されるアプリケーション例外であることを指定できます。アプリケーション・エラーが発生すると、EJBコンテナからクライアントに直接例外が報告されます。
アプリケーション・エラーが発生したときに現在のトランザクションをロールバックするかどうかを指定するには、@ApplicationException
のrollback
ブール属性を使用します。デフォルトでは、エラーが発生しても現在のトランザクションはロールバックされません。
このアノテーションでは、検査済みの例外も未検査の例外も指定できます。
次に示すProcessingException.java
ファイルでは、@ApplicationException
アノテーションを使用して、例外クラスがEJBのビジネス・メソッドによって送出されるアプリケーション例外であることを指定する方法を示します。
package examples; import javax.ejb.ApplicationException; /** * Application exception class thrown when there was a processing error * with a business method of the EJB. Annotated with the * @ApplicationException annotation. */ @ApplicationException() public class ProcessingException extends Exception { /** * Catches exceptions without a specified string * */ public ProcessingException() {} /** * Constructs the appropriate exception with the specified string * * @param message Exception message */ public ProcessingException(String message) {super(message);} }
EJBへのアクセスにセキュリティを設定する
デフォルトでは、EJBのパブリック・メソッドはどのユーザーでも呼び出すことができます。EJBへのアクセスを制限したい場合は、以下のセキュリティ関連アノテーションを使用して、すべてのメソッド(またはメソッドのサブセット)を呼び出すことができるロールを指定します。
-
javax.annotation.security.DeclareRoles
- EJBのセキュリティ設定に使用するセキュリティ・ロールのリストを明示的に宣言します。 -
javax.annotation.security.RolesAllowed
- EJBのメソッドを呼び出すことができるセキュリティ・ロールを指定します。すべてのメソッドを呼び出すことができるロールはクラス・レベルで指定し、特定のメソッドのみを呼び出すことができるロールはメソッド・レベルで指定します。 -
javax.annotation.security.DenyAll
- どのロールでも呼び出すことができないメソッドを指定します。 -
javax.annotation.security.PermitAll
- すべてのロールで呼び出すことができるメソッドを指定します。 -
javax.annotation.security.RunAs
- EJBを実行するロールを指定します。デフォルトでは、EJBはそれを実際に呼び出したユーザーとして実行されます。
上に挙げたアノテーションは、EJB 3.2だけでなく、メタデータ・アノテーションをサポートする様々なJava EEコンポーネントで使用できます。
セキュリティ・ロールを作成し、ロールにユーザーをマッピングするには、WebLogic Server管理コンソールでセキュリティ・レルムを更新します。『Oracle WebLogic Server管理コンソール・オンライン・ヘルプ』のセキュリティ・ロールの管理に関する項を参照してください。
次に、すべてのセキュリティ関連アノテーションを使用した単純なステートレス・セッションEJBのサンプルを示します。太字で示した部分については後ほど解説します。
package examples; import javax.ejb.Stateless; import javax.annotation.security.DeclareRoles; import javax.annotation.security.PermitAll; import javax.annotation.security.DenyAll; import javax.annotation.security.RolesAllowed; import javax.annotation.security.RunAs; /** * Bean file that implements the Service business interface. */ @Stateless @DeclareRoles( { "admin", "hr" } ) @RunAs ("admin") public class ServiceBean implements Service { @RolesAllowed ( {"admin", "hr"} ) public void sayHelloRestricted() { System.out.println("Only some roles can invoke this method."); } @DenyAll public void sayHelloSecret() { System.out.println("No one can invoke this method."); } @PermitAll public void sayHelloPublic() { System.out.println("Everyone can invoke this method."); } }
前述のコードで注目すべき主な点は:
-
セキュリティ関連メタデータ・アノテーションをインポートしています。
import javax.annotation.security.DeclareRoles; import javax.annotation.security.PermitAll; import javax.annotation.security.DenyAll; import javax.annotation.security.RolesAllowed; import javax.annotation.security.RunAs;
-
クラス・レベルの
@DeclareRoles
アノテーションは、後ほど設定する一部またはすべてのメソッドのセキュリティで、admin
およびhr
セキュリティ・ロールを使用することを明示的に指定しています。このアノテーションは必須ではありません。たとえば、@RolesReferenced
アノテーションで参照されるすべてのセキュリティ・ロールは暗黙的に宣言されます。しかし、セキュリティ・ロールを明示的に宣言することでコードが理解しやすくなります。 -
クラス・レベルの
@RunAs
アノテーションは、EJBの特定のメソッドを実際にどのユーザーが呼び出したかに関係なく、EJBコンテナがメソッドをadmin
ロールとして実行することを指定しています。もちろん、元のユーザーにそのメソッドの呼出しが許可されていることが前提になっています。 -
sayHelloRestricted
メソッドの@RolesAllowed
アノテーションは、このメソッドの呼出しをadmin
またはhr
ロールにマッピングされているユーザーにのみ許可することを指定しています。 -
sayHelloSecret
メソッドの@DenyAll
アノテーションは、このメソッドの呼出しをどのロールにマッピングされているユーザーにも許可しないことを指定しています。 -
sayHelloPublic
メソッドの@PermitAll
アノテーションは、このメソッドの呼出しをどのロールにマッピングされているユーザーにも許可することを指定しています。
トランザクション管理とトランザクション属性を指定する
デフォルトでは、EJBコンテナはビジネス・メソッドをトランザクション・コンテキスト内で呼び出します。また、トランザクションをコミットまたはロールバックするかどうかはEJBコンテナ自体が決定します。これを、コンテナ管理によるトランザクションの境界設定といいます。
このデフォルト動作は、Beanファイルで以下のアノテーションを使用して変更できます。
-
javax.ejb.TransactionManagement
- トランザクションの境界設定を、EJBコンテナで管理するかBeanファイルで管理するかを指定します。Beanファイル管理を指定する場合は、Beanファイル内でトランザクション管理をプログラミングする必要があります。通常はJava Transaction API (JTA)を使用してプログラミングします。 -
javax.ejb.TransactionAttribute
- EJBコンテナがメソッドをトランザクション内で呼び出すかどうかを指定します。
javax.ejb.TransactionAttribute
アノテーションを使用しているサンプルについては、「単純なステートフルEJBのサンプル」を参照してください
メタデータ・アノテーションの機能別一覧
以降の各節の表では、アノテーションを機能別にグループ化しています。ここに示すEJB 3.2メタデータ・アノテーションについては、完全なリファレンス情報を「EJBメタデータ・アノテーション・リファレンス」にアルファベット順でまとめてあります。
Beanタイプを指定するためのアノテーション
以下の表では、Beanタイプの指定に使用するアノテーションについて簡単に説明します。
表5-1 Beanタイプを指定するためのアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.Stateless |
Beanクラスがステートレス・セッションBeanであることを指定します。詳細については、「javax.ejb.Stateless」を参照してください |
@javax.ejb.Singleton |
Beanクラスがシングルトン・セッションBeanであることを指定します。詳細は、「javax.ejb.Singleton」を参照してください |
@javax.ejb.Stateful |
Beanクラスがステートフル・セッションBeanであることを指定します。詳細は、「javax.ejb.Startup」を参照してください |
@javax.ejb.Init |
ステートフル・セッションBeanメソッドと、適合するEJB 2.1 EJBHomeまたはEJBLocalHomeクライアント・ビューの |
@javax.ejb.Remove |
ステートフル・セッションBeanのremoveメソッドを指定します。詳細については、「javax.ejb.Remove」を参照してください |
@javax.ejb.MessageDriven |
BeanクラスがメッセージドリブンBeanであることを指定します。詳細については、「javax.ejb.MessageDriven」を参照してください |
@javax.ejb.ActivationConfigProperty |
操作環境でメッセージドリブンBeanを構成するために使用するプロパティを指定します。詳細については、「javax.ejb.ActivationConfigProperty」を参照してください |
ローカル・インタフェースまたはリモート・インタフェースを指定するためのアノテーション
以下の表では、ローカル・インタフェースまたはリモート・インタフェースの指定に使用するアノテーションについて簡単に説明します。
表5-2 ローカル・インタフェースまたはリモート・インタフェースを指定するためのアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.Local |
Beanのローカル・インタフェースを指定します。詳細については、「javax.ejb.Local」を参照してください |
@javax.ejb.Remote |
Beanのリモート・インタフェースを指定します。詳細については、「javax.ejb.Remote」を参照してください |
EJB 2.xクライアント・ビューをサポートするためのアノテーション
以下の表では、EJB 2.Xクライアント・ビューのサポートに使用するアノテーションについて簡単に説明します。
表5-3 EJB 2.xクライアント・ビューをサポートするためのアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.LocalHome |
Beanのローカル・ホーム・インタフェースを指定します。詳細については、「javax.ejb.LocalHome」を参照してください |
@javax.ejb.RemoteHome |
Beanのリモート・ホーム・インタフェースを指定します。詳細については、「javax.ejb.RemoteHome」を参照してください |
3.0エンティティBeanを呼び出すためのアノテーション
以下の表では、3.0エンティティBeanの呼出しに使用するアノテーションについて簡単に説明します。
表5-4 3.0エンティティBeanを呼び出すためのアノテーション
アノテーション | 説明 |
---|---|
@javax.persistence.PersistenceContext |
|
@javax.persistence.PersistenceContexts |
1つまたは複数の |
@javax.persistence.PersistenceUnit |
|
@javax.persistence.PersistenceUnits |
1つまたは複数の |
トランザクション関連のアノテーション
以下の表では、トランザクションに使用するアノテーションについて簡単に説明します。
表5-5 トランザクション関連のアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.TransactionManagement |
トランザクションの境界設定管理の種類(コンテナ管理またはBean管理)を指定します。詳細については、「javax.ejb.TransactionManagement」を参照してください |
@javax.ejb.TransactionAttribute |
ビジネス・メソッドをトランザクションのコンテキスト内で呼び出すかどうかを指定します。詳細については、「javax.ejb.TransactionManagement」を参照してください |
インターセプタを指定するためのアノテーション
以下の表では、インターセプタの指定に使用するアノテーションについて簡単に説明します。
表5-6 インターセプタを指定するためのアノテーション
アノテーション | 説明 |
---|---|
@javax.interceptor.Interceptors |
Beanクラスまたはメソッドに関連付けるインターセプタ・クラスのリストを指定します。詳細については、「javax.interceptor.Interceptors」を参照してください |
@javax.interceptor.AroundInvoke |
インターセプタ・メソッドを指定します。詳細については、「javax.interceptor.AroundInvoke」を参照してください |
@javax.interceptor.ExcludeClassInterceptors |
アノテーションを付けたメソッドが呼び出されたときに、クラス・レベルのインターセプタを呼び出さないことを指定します。詳細は、javax.interceptor.ExcludeClassInterceptorsを参照してください |
@javax.interceptor.ExcludeDefaultInterceptors |
アノテーションを付けたメソッドが呼び出されたときに、デフォルト・インターセプタを呼び出さないことを指定します。詳細は、javax.interceptor.ExcludeDefaultInterceptorsを参照してください |
ライフサイクル・コールバックを指定するためのアノテーション
以下の表では、ライフサイクル・コールバックの指定に使用するアノテーションについて簡単に説明します。
表5-7 ライフサイクル・コールバックを指定するためのアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.PostActivate |
ステートフル・セッションBeanがアクティブ化された後にコールバックを受信するメソッドを指定します。詳細については、「javax.ejb.PostActivate」を参照してください |
@javax.ejb.PrePassivate |
ステートフル・セッションBeanがパッシブ化される前にコールバックを受信するメソッドを指定します。詳細については、「javax.ejb.PrePassivate」を参照してください |
@javax.annotation.PostConstruct |
依存関係インジェクションが完了した後に、初期化を実行するために呼び出す必要のあるメソッドを指定します。詳細については、「javax.annotation.PostConstruct」を参照してください |
@javax.annotation.PreDestroy |
コンテナがインスタンスを削除しようとしていることを知らせるコールバック通知を受信するメソッドを指定します。詳細については、「javax.annotation.PreDestroy」を参照してください |
セキュリティ関連のアノテーション
以下のメタデータ・アノテーションは、EJB 3.2固有のアノテーションではなく、javax.annotation.security
パッケージに含まれる一般的なセキュリティ関連アノテーションです。
表5-8 セキュリティ関連のアノテーション
アノテーション | 説明 |
---|---|
@javax.annotation.security.DeclareRoles |
Beanクラス内のセキュリティ・ロールへの参照を指定します。詳細については、「javax.annotation.security.DeclareRoles」を参照してください |
@javax.annotation.security.RolesAllowed |
Beanのビジネス・メソッドを呼び出すことができるセキュリティ・ロールのリストを指定します。詳細については、「javax.annotation.security.RolesAllowed」を参照してください |
@javax.annotation.security.PermitAll |
そのメソッドがすべてのセキュリティ・ロールで呼び出せることを指定します。詳細については、「javax.annotation.security.PermitAll」を参照してください |
@javax.annotation.security.DenyAll |
そのメソッドがどのセキュリティ・ロールでも呼び出せないことを指定します。詳細については、「javax.annotation.security.DenyAll」を参照してください |
@javax.annotation.security.RunAs |
そのメソッドをどのセキュリティ・ロールとして実行するかを指定します。詳細については、「javax.annotation.security.RunAs」を参照してください |
コンテキスト依存性アノテーション
以下の表では、コンテキスト依存性に使用するアノテーションについて簡単に説明します。
表5-9 コンテキスト依存性アノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.EJB |
EJBビジネス・インタフェースまたはホーム・インタフェースへの依存性を指定します。詳細については、「javax.ejb.EJB」を参照してください |
@javax.ejb.EJBs |
1つまたは複数の |
@javax.annotation.Resource |
Beanの環境内の外部リソースへの依存性を指定します。詳細については、「javax.annotation.Resource」を参照してください |
@javax.annotation.Resources |
1つまたは複数の |
タイムアウトと例外のアノテーション
以下の表では、タイムアウトと例外に使用するアノテーションについて簡単に説明します。
表5-10 タイムアウトと例外のアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.Timeout |
Beanクラスのタイムアウト・メソッドを指定します。詳細については、「javax.ejb.Timeout」を参照してください |
@javax.ejb.ApplicationException |
例外がアプリケーション例外で、クライアントに直接報告することを指定します。詳細については、「javax.ejb.ApplicationException」を参照してください |
タイマーとスケジューリングのアノテーション
以下の表では、タイマーおよびスケジューリングに固有のアノテーションに使用するアノテーションについて簡単に説明します。
表5-11 タイマーとスケジューリングのアノテーション
アノテーション | 説明 |
---|---|
@javax.ejb.Timeout |
Beanクラスのタイムアウト・メソッドを指定します。詳細については、「javax.ejb.Timeout」を参照してください |
@javax.ejb.ApplicationException |
例外がアプリケーション例外で、クライアントに直接報告することを指定します。詳細については、「javax.ejb.ApplicationException」を参照してください |