WebLogic エンタープライズ JavaBeans バージョン 3.0 プログラマーズ ガイド

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

エンタープライズ JavaBeans 3.0 の反復的な開発

以下の節では、EJB 3.0 の一般的な実装プロセスを説明し、EJB 3.0 を WebLogic Server で実行する方法について説明します。

WebLogic Server EJB の機能の概要については、「WebLogic Server の EJB 3.0 の付加価値機能」を参照してください。

 


EJB 3.0 開発プロセスの概要

この節では、EJB 3.0 の開発プロセスを簡単に説明します。主な実装タスクと関連する結果について説明します。

次の節の大部分では、EJB 3.0 プログラミング モデルについて説明しています。3.0 と 2.X でのプログラミング モデルの相違点については、一部で簡単に触れているだけです。EJB 2.X に精通しており、2 つのモデルの相違点について詳しく知りたい場合は、「EJB 3.0 の新機能および EJB 2.X との相違点」を参照してください。

表 4-1 EJB 開発タスクと結果
手順
説明
結果
Java ソース ファイルのディレクトリ構造を作成し、必要に応じてデプロイメント記述子を作成する。
ローカル ドライブ上のディレクトリ構造
EJB を記述するために必要なビジネス インタフェースを作成する。
.java ファイル
ビジネス インタフェースを実装する Java ファイルを作成し、EJB の動作を記述する EJB 3.0 メタデータ アノテーションを含める。
.java ファイル
必要に応じて、ビジネス メソッド呼び出しやライフサイクル コールバック イベントをインターセプトするインターセプタを記述したインターセプタ クラスを作成する。
.java ファイル
ソース コードをコンパイルする。
各クラスおよびインタフェースの .class ファイル
必要に応じて、EJB 固有のデプロイメント記述子を作成する。この手順は、EJB 3.0 プログラミング モデルを使用する場合は不要。
  • ejb-jar.xml
  • weblogic-ejb-jar.xml (WebLogic Server 固有の機能を制御する要素が格納される)
  • weblogic-cmp-jar.xml (Bean がコンテナ管理による永続性エンティティ Bean である場合)
コンパイル済みのクラス (および、必要に応じてデプロイメント記述子) をデプロイメント用にパッケージ化する。
状況によっては、ファイルをアーカイブせずにディレクトリ形式で展開しておくことも可能。
アーカイブ ファイル (EJB JAR またはエンタープライズ アプリケーション EAR)、または対応する展開済みディレクトリ
選択したステージング モードに従って、アーカイブまたはアプリケーション ディレクトリの対象として目的の管理対象サーバまたは WebLogic Server クラスタを設定する。
Bean のデプロイメント設定は、config.xmlEJBComponent 要素に書き込まれる。

 


ソース ディレクトリの作成

EJB 3.0 をアセンブルするソース ディレクトリを作成します。

ソース ファイルと出力ファイルを並列ディレクトリ構造に分離する分割開発ディレクトリ構造をお勧めします。分割ディレクトリ構造を準備し、EJB 3.0 をエンタープライズ アプリケーション アーカイブ (EAR) としてパッケージ化する方法については、『WebLogic Server アプリケーションの開発』の「分割開発ディレクトリ環境の概要」を参照してください。

EJB 3.0 を JAR ファイルにパッケージ化してデプロイする場合は、クラス ファイル用のディレクトリを作成します。また、デプロイメント記述子も作成する場合は、META-INF というサブディレクトリに格納します (なお、EJB 3.0 プログラミング モデルでは、デプロイメント記述子は省略可能ですがサポートはされています)。

コード リスト 4-1 JAR をパッケージ化するためのディレクトリ構造

myEJB/
     META-INF/
          ejb-jar.xml
          weblogic-ejb-jar.xml
          weblogic-cmp-jar.xml
     foo.class
     fooHome.class
     fooBean.class

 


EJB 3.0 ビジネス インタフェースのプログラミング

EJB 3.0 ビジネス インタフェースは、EJB のすべてのビジネス メソッドの完全なシグネチャを記述するプレーン Java インタフェースです。たとえば、Account EJB が顧客の当座預金口座を表す場合であれば、そのビジネス インタフェースには顧客がその口座を管理するためのメソッド (withdrawdepositbalance など) を含めます。

EJB 3.0 ビジネス インタフェースは、他のインタフェースを拡張できます。メッセージ駆動型 Bean の場合であれば、ビジネス インタフェースはメッセージ リスナ インタフェースにするのが一般的です。どのメッセージング リスナ インタフェースにするかは、その Bean で使用するメッセージングの種類によって決まります。たとえば、JMS の場合は javax.jms.MessageListener になります。セッション Bean のインタフェースには、このような明確な種類はありません。ビジネス ニーズに合わせて、どのようなインタフェースでも使用できます。

警告 : EJB 3.0 ビジネス インタフェースの唯一の要件は、javax.ejb.EJBObject または javax.ejb.EJBLocalObject を拡張してはいけないことです (EJB 2.X でも同様)。

ステートレスおよびステートフル セッション Bean によって実装されたビジネス インタフェースのサンプルについては、「単純なステートレス EJB のサンプル」および「単純なステートフル EJB のサンプル」を参照してください。

ビジネス インタフェース アプリケーション例外

EJB のビジネス メソッドを設計する場合は、EJB のビジネス インタフェースのメソッドの throws 句にアプリケーション例外を定義できます。「アプリケーション例外」とは、Bean クラス内に作成したプログラムからクライアントに、アプリケーション レベルの異常な状態を警告するための例外です。たとえば、顧客が当座預金口座の引き出し可能額を超える金額を引き出そうとしたときに、その口座を表す Account EJB の withdraw() メソッドからアプリケーション例外を送出できます。

アプリケーション例外は、「システム例外」とは異なります。システム例外は、データベース管理システムが利用できないなど、システム レベルの例外をクライアントに警告するために EJB コンテナから送出される例外です。システム レベルのエラーが、アプリケーション例外として報告されないようにしてください。

また、インタフェースがリモート ビジネス インタフェースである場合や、Bean クラスに @WebService JWS アノテーションが含まれている場合、およびメソッドに @WebMethod アノテーションが含まれている場合でも、ビジネス メソッドが java.rmi.RemoteException 例外を送出しないようにする必要があります。唯一の例外は、ビジネス インタフェースが java.rmi.Remote を拡張している場合です。EJB コンテナでプロトコル レベルの問題が発生すると、基底の RemoteException をラップした EJBException が送出されます。

注意 : @WebService および @WebMethod アノテーションは、javax.jws パッケージに含まれています。これらのアノテーションは、EJB に Web サービスを実装すること、および EJB ビジネスをパブリックな Web サービス オペレーションとしてエクスポーズすることを指定するために使用します。これらのアノテーションの詳細、および Web サービスのプログラミング全般については、『WebLogic Web サービス入門』を参照してください。

EJB でのジェネリックスの使用

EJB 3.0 プログラミング モデルでは、ビジネス インタフェースにおいてクラス レベルでジェネリックスを使用できます。

ジェネリックスを使用する場合のベスト プラクティスとしては、まずジェネリックスを使用するスーパーインタフェースを定義し、実際のビジネス インタフェースでは特定のデータ型を使用してこのスーパーインタフェースを拡張することをお勧めします。

次に、この方法のサンプルを示します。まず、ジェネリックスを使用するスーパーインタフェースをプログラミングします。

  public interface RootI<T> {
    public T getObject();
public void updateObject(T object);
}

次に、実際のビジネス インタフェースをプログラミングし、特定のデータ型で Root*<T> を拡張します。

  @Remote
public interface StatelessI extends RootI<String> { }

最後に、実際のステートレス セッション Bean をプログラミングしてビジネス インタフェースを実装します。メソッドの実装では、指定したデータ型 (この場合は String) を使用します。

  @Stateless
public class StatelessSample implements StatelessI {
public String getObject() {
return null;
}
public void updateObject(String object) {
}
}

 


アノテーション付き EJB クラスのプログラミング

EJB Bean クラスは、EJB プログラミングの主要なアーティファクトで、EJB ビジネス インタフェースを実装し、EJB メタデータ アノテーションを含みます。EJB メタデータ アノテーションの用途としては、EJB コンテナへのセマンティクスおよび要件の指定、コンテナ サービスの要求、アプリケーション デプロイヤやコンテナ ランタイムへの構造情報およびコンフィグレーション情報の提供などがあります。

EJB 3.0 プログラミング モデルで必須なアノテーションは、EJB のタイプを指定する @javax.ejb.Stateful@javax.ejb.Stateless、または @javax.ejb.MessageDriven のいずれか 1 つのみです。他にもさまざまなアノテーションを使用して EJB を細かくコンフィグレーションできますが、それらのアノテーションには一般的なデフォルト値が設定されているため、デフォルト以外の動作を設定したい場合を除けば、Bean クラス内で明示的にそれらのアノテーションを使用する必要はありません。このようなプログラミング モデルにより、一般的な動作を実行する EJB のプログラミングが非常に簡単になっています。

Bean クラスのプログラミングの詳細やサンプルについては、「アノテーション付き EJB 3.0 クラスのプログラミング」を参照してください。

 


インターセプタのプログラミング (省略可能)

インターセプタは、ビジネス メソッドの呼び出しやライフサイクル コールバック イベントをインターセプトするメソッドです。

インターセプタ メソッドは、実際の Bean クラス内に定義できますが、Bean クラスとは別にインターセプタ クラスをプログラミングして @javax.ejb.Interceptor アノテーションで Bean クラスに関連付けることもできます。

インターセプタを使用する Bean クラスのプログラミングについては、「ビジネス メソッドまたはライフサイクル コールバック イベントのインターセプタを指定する」を参照してください。

 


Java ソースのコンパイル

EJB Bean クラスの Java ソース コードの記述と、必要に応じてインターセプタ クラスの記述が完了したら、それらをクラス ファイルにコンパイルする必要があります。コンパイルするためのツールとしては以下が一般的です。

 


デプロイメント記述子の作成と編集 (省略可能)

新しい EJB 3.0 プログラミング モデルの非常に重要な点は、メタデータ アノテーションが導入されたことです。アノテーションを使用すると、コンテナ内での Bean の動作、依存性注入の要求方法などを Java クラス自体の中で指定でき、EJB の開発プロセスを簡略化できます。アノテーションは、EJB の 2.X 以前のバージョンで必要だったデプロイメント記述子に代わるものです。

デプロイメント記述子は、EJB 3.0 でも引き続き完全にサポートされます。ただし、Java Platform, Enterprise Edition (Java EE) バージョン 5 標準のデプロイメント記述子は必須ではありません。たとえば、従来の 2.X プログラミング モデルを使用したい場合や、後々の開発やデプロイメントの段階でより細かくカスタマイズできるようにしたい場合、メタデータ アノテーションに加えて (またはメタデータ アノテーションの代わりに) 標準のデプロイメント記述子を作成できます。

デプロイメント記述子要素は、対応するアノテーションを常にオーバーライドします。たとえば、Bean クラス内に @javax.ejb.TransactionManagement(BEAN) アノテーションを指定した上で、その EJB 用の ejb-jar.xml デプロイメント記述子を作成し、<transaction-type> 要素を container に設定した場合は、デプロイメント記述子の値が優先され、この EJB ではコンテナ管理によるトランザクションの境界設定が使用されます。

注意 : EJB 3.0 バージョンでは、2.X でサポートされていた WebLogic 固有の EJB 機能がすべてサポートされます。ただし、weblogic-ejb-jar.xml または weblogic-cmp-rdbms-jar.xml デプロイメント記述子ファイルでコンフィグレーションする機能は、この EJB 3.0 のリリースでも引き続き同じ方法でコンフィグレーションする必要があります。これは、現時点ではそれらの機能と同等のアノテーションが存在しないためです。

2.X バージョンの『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』では、Java EE 標準および WebLogic 固有の EJB デプロイメント記述子の作成と編集について詳しく解説しています。特に、以下の節を参照してください。

 


パッケージ化

EJB は、エンタープライズ アプリケーションの一部としてパッケージ化することをお勧めします。詳細については、『WebLogic Server アプリケーションの開発』の「分割開発ディレクトリからのデプロイメントとパッケージ化」を参照してください。

EJB 固有のパッケージ化に関するその他の情報については、「クライアントが他のアプリケーションにある EJB のパッケージ化の考慮事項」を参照してください。

 


デプロイメント

EJB をデプロイすると、WebLogic Server は EJB のコンポーネントをクライアントに提供できるようになります。EJB は、ユーザの環境と EJB がプロダクション環境に置かれるかどうかに基づいて、複数の手順のうちの 1 つでデプロイできます。3.0 プログラミング モデルで作成した EJB のデプロイメント方法は、2.X プログラミング モデルで作成した EJB のデプロイメント方法と同じです。

WebLogic Server アプリケーションおよびモジュール (EJB を含む) をデプロイする一般的な手順については、『WebLogic Server アプリケーションのデプロイメント』を参照してください。EJB 固有のデプロイメントの問題と手続きについては、2.X プログラミング モデルに絞って説明されている『WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』の「エンタープライズ JavaBean のデプロイメント ガイドライン」を参照してください。


ページの先頭       前  次