プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server Enterprise JavaBeansの開発
12c (12.2.1.2.0)
E82896-01
目次へ移動
目次

前
次

3 Enterprise JavaBeansの単純なサンプル

この章では、バージョン3.xのプログラミング・モデルを使用するEJBのJavaサンプルについて説明します。

この章の内容は以下のとおりです。

EJB 3.xの単純なJavaサンプル

次の項では、新しいメタデータ・アノテーション・プログラミング・モデルを使用するEJBの単純なJavaサンプルについて説明します。このガイド内のEJBをプログラミングする方法について説明しているいくつかの項では、これらのサンプルを参照する場合があります。

インタフェースなしの単純なステートレスEJBのサンプル

EJB 3.1のインタフェースなしのローカル・クライアント・ビュー・タイプでは、個別のローカル・ビジネス・インタフェースを必要とすることなく、ローカル・セッションBeanへのアクセスを提供して、コンポーネントでEJB Beanクラス・インスタンスを直接注入させることで、EJBの開発を単純化しています。

次に、ServiceBeanステートレス・セッションEJBのインタフェースなしの単純なビューのコードを示します。

package examples;
@Stateless
public class ServiceBean {
  public void sayHelloFromServiceBean() {
    System.out.println("Hello From Service Bean!");
  }
}

このサンプル・コードで注目すべき主な点は以下のとおりです。

  • このビュー以外にクライアント・ビューが公開されておらず、Beanクラスのimplements句が記述されていないので、EJBはこのインタフェースなしのビューを自動的に公開します。

  • ServiceBean Beanファイルは、プレーンJavaファイルであるため、EJB固有のインタフェースを実装する必要はありません。

  • クラス・レベルの@Statelessメタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。

単純なビジネス・インタフェースを使用するステートレスEJBのサンプル

次に、ServiceBeanステートレス・セッションEJBの単純なビジネス・インタフェースのコードを示します。

package examples;
/**
* Business interface of the Service stateless session EJB
*/
public interface Service {
  public void sayHelloFromServiceBean();
}

このコードは、Serviceビジネス・インタフェースに、1つのメソッドsayHelloFromServiceBean()が含まれていることを示します。このメソッドは、パラメータを取らず、voidを返します。

次に、上のServiceインタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。

package examples;
import javax.ejb.Stateless;
import javax.interceptor.ExcludeDefaultInterceptors;
/**
 * Bean file that implements the Service business interface.
 * Class uses following EJB 3.x annotations:
 *   - @Stateless - specifies that the EJB is of type stateless session
 *   - @ExcludeDefaultInterceptors - specifies any configured default
 *      interceptors should not be invoked for this class
 */
@Stateless
@ExcludeDefaultInterceptors
public class ServiceBean
  implements Service
{
  public void sayHelloFromServiceBean() {
    System.out.println("Hello From Service Bean!");
  }
}

このサンプル・コードで注目すべき主な点は以下のとおりです。

  • 標準のimport文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。

    import javax.ejb.Stateless;
    import javax.interceptor.ExcludeDefaultInterceptors
    

    EJB 3.1にのみ適用されるアノテーションは、javax.ejbパッケージに含まれています。他のJava EEバージョン6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptorjavax.annotationなど)に含まれています。

  • ServiceBean Beanファイルは、Serviceビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreateejbPassivateなど)を実装する必要はないということです。

  • クラス・レベルの@Statelessメタデータ・アノテーションは、EJBのタイプがステートレス・セッションであることを指定しています。

  • クラス・レベルの@ExcludeDefaultInterceptorsアノテーションは、ejb-jar.xmlデプロイメント記述子ファイルでデフォルト・インターセプタが定義されている場合でも、このEJBのメソッド呼出しに対しては、そのデフォルト・インターセプタを呼び出さないことを指定しています。

単純なステートフルEJBのサンプル

次に、AccountBeanステートフル・セッションEJBの単純なビジネス・インタフェースのコードを示します。

package examples;
/**
 * Business interface for the Account stateful session EJB.
 */
public interface Account {
  public void deposit(int amount);
  public void withdraw(int amount);
  public void sayHelloFromAccountBean();
}

このコードは、Accountビジネス・インタフェースに3つのメソッド(depositwithdraw、およびsayHelloFromAccountBean)が含まれていることを示します。

次に、上のAccountインタフェースを実装するBeanファイルのコードを示します。太字部分については、後ほど解説します。

package examples;
import javax.ejb.Stateful;
import javax.ejb.Remote;
import javax.ejb.EJB;
import javax.annotation.PreDestroy;
import javax.interceptor.Interceptors;
import javax.interceptor.ExcludeClassInterceptors;
/**
 * Bean file that implements the Account business interface.
 * Uses the following EJB annotations:
 *    -  @Stateful: specifies that this is a stateful session EJB
 *    -  @Remote - specifies the Remote interface for this EJB
 *    -  @EJB - specifies a dependency on the ServiceBean stateless
 *         session ejb
 *    -  @Interceptors - Specifies that the bean file is associated with an
 *         Interceptor class; by default all business methods invoke the
 *         method in the interceptor class annotated with @AroundInvoke.
 *    -  @ExcludeClassInterceptors - Specifies that the interceptor methods
 *         defined for the bean class should NOT fire for the annotated
 *         method.
 *    -  @PreDestroy - Specifies lifecycle method that is invoked when the
 *         bean is about to be destoryed by EJB container.
 *
 */
@Stateful
@Remote({examples.Account.class})
@Interceptors({examples.AuditInterceptor.class})
public class AccountBean
 implements Account
{
  private int balance = 0;
  @EJB(beanName="ServiceBean")
  private Service service;
  public void deposit(int amount) {
    balance += amount;
    System.out.println("deposited: "+amount+" balance: "+balance);
  }
  public void withdraw(int amount) {
    balance -= amount;
    System.out.println("withdrew: "+amount+" balance: "+balance);
  }
  @ExcludeClassInterceptors
  public void sayHelloFromAccountBean() {
    service.sayHelloFromServiceBean();
  }
  @PreDestroy
  public void preDestroy() {
   System.out.println("Invoking method: preDestroy()");  
  }
}

このサンプル・コードで注目すべき主な点は以下のとおりです。

  • 標準のimport文を使用して、Beanファイルで使用するメタデータ・アノテーションをインポートしています。

    import javax.ejb.Stateful;
    import javax.ejb.Remote;
    import javax.ejb.EJB;
    
    import javax.annotation.PreDestroy;
    
    import javax.interceptor.Interceptors;
    import javax.interceptor.ExcludeClassInterceptors;
    

    EJB 3.1にのみ適用されるアノテーションは、javax.ejbパッケージに含まれています。他のJava EE 6コンポーネントで使用できるアノテーションは、より一般的なパッケージ(javax.interceptorjavax.annotationなど)に含まれています。

  • AccountBean Beanファイルは、Accountビジネス・インタフェースを実装するプレーンJavaファイルで、EJB固有のインタフェースを実装する必要はありません。つまり、Beanファイルには、2.xプログラミング・モデルでは必須だったライフサイクル・メソッド(ejbCreateejbPassivateなど)を実装する必要はないということです。

  • クラス・レベルの@Statefulメタデータ・アノテーションは、EJBのタイプがステートフル・セッションであることを指定しています。

  • クラス・レベルの@Remoteアノテーションは、EJBのリモート・インタフェースの名前(ここでは、ビジネス・インタフェースと同じAccount)を指定しています。

  • クラス・レベルの@Interceptors({examples.AuditInterceptor.class})アノテーションは、Beanファイルに関連付けるインターセプタ・クラスを指定しています。通常、このクラスには、ビジネス・メソッド・インターセプタ・メソッドとライフサイクル・コールバック・インターセプタ・メソッドが含まれます。このクラスの詳細については、「インターセプタ・クラスのサンプル」を参照してください。

  • フィールド・レベルの@EJBアノテーションは、アノテーション変数serviceに、依存先であるServiceBeanステートレス・セッションBeanのコンテキストを注入することを指定しています。注入されるフィールドのデータ型はServiceです。これは、ServiceBean EJBのビジネス・インタフェースです。sayHelloFromAccountBeanメソッド内の次のコードは、依存先であるServiceBeansayHelloFromServiceBeanメソッドを呼び出す方法を示しています。

    service.sayHelloFromServiceBean();
    
  • メソッド・レベルの@ExcludeClassInterceptorsアノテーションは、sayHelloFromAccountBeanメソッドに対しては、関連付けられているインターセプタ・クラス(AuditInterceptor)で指定されている@AroundInvokeメソッドを呼び出さないことを指定しています。

  • メソッド・レベルの@PreDestroyアノテーションは、EJBコンテナがAccountBeanのインスタンスを破棄する前にpreDestroyメソッドを呼び出すことを指定しています。ビジネス・メソッドおよびライフサイクル・コールバックのインターセプタ・メソッドは、インターセプタ・クラスを関連付ける方法だけでなく、このようにBeanファイル自体の中で指定することもできます。

インターセプタ・クラスのサンプル

次に、インターセプタ・クラスのサンプル・コードを示します。このAuditInterceptorクラスは、上のサンプルで示したAccountBeanステートフル・セッションBeanから@Interceptors({examples.AuditInterceptor.class})アノテーションで参照しているインターセプタ・クラスです。太字部分については、後ほど解説します。

package examples;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
import javax.ejb.PostActivate;
import javax.ejb.PrePassivate;
/**
 * Interceptor class.  The interceptor method is annotated with the
 *  @AroundInvoke annotation.
 */
public class AuditInterceptor {
  public AuditInterceptor() {}
  @AroundInvoke
  public Object audit(InvocationContext ic) throws Exception {
    System.out.println("Invoking method: "+ic.getMethod());
    return ic.proceed();
  }
  @PostActivate
  public void postActivate(InvocationContext ic) {
    System.out.println("Invoking method: "+ic.getMethod());
  }
  @PrePassivate
  public void prePassivate(InvocationContext ic) {
    System.out.println("Invoking method: "+ic.getMethod());
  }
}

このサンプル・コードで注目すべき主な点は以下のとおりです。

  • これまでのサンプルと同様に、ファイル内で使用するメタデータ・アノテーションをインポートしています。

    import javax.interceptor.AroundInvoke;
    import javax.interceptor.InvocationContext;
    import javax.ejb.PostActivate;
    import javax.ejb.PrePassivate;
    
  • インターセプタ・クラスはプレーンJavaクラスです。

  • このクラスには、次のような空のコンストラクタが含まれています。

    public AuditInterceptor() {}
    
  • メソッド・レベルの@AroundInvokeは、ビジネス・メソッド・インターセプタ・メソッドを指定しています。このアノテーションは、1つのインターセプタ・クラス内で一度だけ使用できます。

  • メソッド・レベルの@PostActivateおよび@PrePassivateアノテーションは、EJBコンテナがBeanを再アクティブ化した後とBeanをパッシブ化する前に呼び出すメソッドをそれぞれ指定しています。

    注意:

    これらのライフサイクル・コールバック・インターセプタ・メソッドは、ステートフル・セッションBeanにのみ適用されます。

WebLogic Serverでパッケージ化されたEJB 3.2のサンプル

次の項では、Oracle WebLogic Serverに付属するパッケージ化されたJava EE 7のサンプル(EJB 3.2の新機能のデモ)について説明します。

EJB 3.2: セッションBeanライフサイクルを使用するサンプル

このサンプルは、@AroundConstructおよび@AroundInvokeを含む、新しいセッションBeanライフサイクル・コールバック・インターセプタ・メソッドAPIを示します。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee7/ejb/lifecylce

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.2: メソッドのないリスナーを使用するメッセージドリブンBeanのサンプル

このサンプルは、メソッドのないリスナー・インタフェースを実装するメッセージドリブンBeanを示します。メソッドのないインタフェースを実装するBeanは、java.lang.Objectを除き、メッセージ・リスナー・メソッドとして、Beanクラスおよびスーパークラスのすべての非静的パブリック・メソッドを公開します。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee7/ejb/no-method-listener

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

WebLogic Serverでパッケージ化されたEJB 3.1のサンプル

次の項では、Oracle WebLogic Serverに付属するパッケージ化されたJava EE 6のサンプル(EJB 3.1の新機能のデモ)について説明します。

EJB 3.1: シングルトン・セッションBeanのサンプル

このサンプルは、EJB 3.1シングルトン・セッションBeanの使用方法を示しています。これはアプリケーション開発者に、特定のJava仮想マシン(JVM)のアプリケーションで、セッションBeanが一度インスタンス化されることが保証される正式なプログラミング構造を提供します。このサンプルで、@SingletonセッションBeanは、中央カウンタ・サービスを提供します。カウンタEJBは、Javaクライアントから呼び出され、それが使用されていることを示します。クライアントが複数回呼び出されると、カウントはそのたびに1ずつ増分されます。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/singletonBean

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.1: 非同期メソッドEJBのサンプル

このサンプルは、EJB 3.1の非同期メソッドの呼出しの使用方法について示します。@AsynchronousアノテーションをEJBクラスまたは特定のメソッドに追加すると、メソッドが呼び出されたときに、クライアントに即座に制御を戻すようにEJBコンテナに指示します。メソッドはFutureオブジェクトを返し、これによりクライアントはメソッド呼出しのステータスをチェックして、非同期に生成される結果の値を取得できます。

このサンプルでは、@Stateless Beanはクラス・レベルでアノテーションが付けられます。@Asynchronousはそのメソッドがすべて非同期であることを示し、それぞれのメソッドで長時間の計算をシミュレートします。サーブレットを使用して様々な非同期メソッドをコールし、呼び出しと完了回数を追跡して、メソッド・コールの非同期の動作を示します。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/asyncMethodOfEJB

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、Oracle WebLogic Serverの理解のサンプル・アプリケーションとコード例を参照してください。

EJB 3.1: カレンダベース・タイマーEJBのサンプル

このサンプルは、EJB 3.1の豊富なスケジューリング機能を示しています。このスケジューリング機能は、EJBメソッドに配置できるCRONスタイルのスケジュール定義という形式をとり、定義されたスケジュールに応じてメソッドが自動的に呼び出されます。このサンプルは、メソッドがコールされたときのタイムスタンプを生成して保存する、@SingletonセッションBeanのメソッド用に定義された@Scheduleアノテーションの使用方法を示しています。対応するサーブレットが提供され、その中にTimerBeanが注入されて、ブラウザに表示されるタイムスタンプのリストが取得されます。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/calendarStyledTimer

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.1: 単純化されたインタフェースなしのプログラミングおよびWARファイルでのパッケージ化

このサンプルは、EJB 3.1で提供された単純化されたプログラミングおよびパッケージ化モデルの変更を示しています。前のバージョンではJavaインタフェースを使用する必要がありましたが、EJB 3.1ではその必要性がなくなったので、古いプレーンJavaオブジェクトにアノテーションを付けてEJBコンポーネントとして使用できます。EJBコンポーネントを直接Webアプリケーションの中に配置する機能によりさらに単純化が進んだので、WebコンポーネントとEJBコンポーネントを保存するアーカイブを生成して、それらをともにエンタープライズ・アーカイブ(EAR)ファイルに組み込む必要がなくなりました。

このサンプルでは、@Statelessアノテーションを古いプレーンJavaクラスに指定し、これをEJBセッションBeanとして公開します。これはさらに、@EJBアノテーションを使用して@WebServletクラスに注入されることで、それがEJBモジュールとして使用されていることが示されます。EJBセッションBeanとサーブレット・クラスは、ともに単一のWARファイルにパッケージ化されてデプロイメントされます。これにより、Java EE 6で使用できる単純化されたパッケージおよびデプロイメントの変更について説明します。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/noInterfaceViewInWAR

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.1: EJBでポータブル・グローバルJNDI名を使用するサンプル

このサンプルは、EJB 3.1で使用可能な、ポータブル・グローバルJNDIネーミング・オプションの使用方法を示しています。ポータブル・グローバルJNDIでは、一般的でよく知られているネームスペースを多数提供し、そのネームスペースでjava:global[/<アプリケーション名>]/<モジュール名>/<Bean名>というパターンを使用して、EJBコンポーネントを登録およびルックアップできます。これにより、EJBコンポーネントをJNDIに登録する方法および場所、およびそれらをアプリケーションでルックアップおよび使用する方法を標準化します。このサンプルでは、サーブレットでポータブルJNDI名java:module/HelloBeanを使用してEJBセッションBeanをルックアップします。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/portableGlobalJNDIName

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.1: Java SEで組込み可能なEJBコンテナを使用するサンプル

このサンプルは、EJB 3.1で使用可能な組込み可能なEJBコンテナを使用することで、クライアント・コードとそれに対応するエンタープライズBeanをJava EEサーバーにデプロイしなくてもJava SE環境で実行できるようにする方法を示しています。

このサンプルでは、組込み可能なWebLogic EJBコンテナを使用して、Java SE環境から呼び出されるすべてのユーザー・オブジェクトを表示します。アノテーション@Startupおよび@PostConstructを使用してアプリケーションを起動すると、シングルトン・コンポーネントInitBeanの即時初期化時にすべてのユーザー・オブジェクトが事前定義されます。EJBContainerのインスタンスがJavaクライアントUserClientで作成され、セッションBean参照UserBeanをルックアップし、アプリケーションでビジネス・メソッドviewUsersを呼び出します。

サンプルの実行後、クライアント・クラスが自動的に実行され、サンプルが作成されたコマンド・シェルに実行時メッセージが出力されます。すべての既存のユーザー・オブジェクトがサンプル・データベースから取得され、コマンド・シェルにその詳細が表示されます。

WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/javaee6/ejb/embeddableContainer

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。

EJB 3.0: セッションBeanからエンティティを呼び出すサンプル

セッションBeanからエンティティを呼び出すサンプルについては、配布キットに含まれているEJB 3.0のサンプルを参照してください。WebLogic Serverをインストールすると、次のディレクトリにサンプルがインストールされます。

EXAMPLES_HOME/examples/src/examples/ejb/ejb30

EXAMPLES_HOMEは、WebLogic Serverのサンプル・コードが構成されているディレクトリを表します。詳細は、『Oracle WebLogic Serverの理解』のサンプル・アプリケーションおよびサンプル・コードに関する項を参照してください。