EJB 3.0 ステートレス・セッション Bean のサンプル
このサンプルは以下に記述します EJB 3.0 からの新機能のデモンストレーションです。
- セッション Bean 用に EJB コンポーネントのインターフェースが必要なくなりました。必要とされるセッション Bean 用のビジネス・インターフェースは、EJBObject、EJBLocalObject、java.rmi.Remote インターフェースではなく、プレーン Java のインターフェースとなりました。
- セッション Bean 用ホーム・インターフェースの必要なくなりました。
- 環境依存部分のカプセル化や JNDI へは、アノテーションによる依存性注入方式で簡易検索方式を通じて接続します。
- Java メタ・データのアノテーションの導入は、デプロイメント・ディスクリプターの代わりとして使われることになります。
計算機
Calculator.java: EJBObject、EJBLocalObject、java.rmi.Remote のような EJB コンポーネントのインターフェースの代わりとして、ステートレス・セッション Bean は単純な Java インターフェースを実装します。このクラスに @Stateless というアノテーションを記述することによって、別に記述していたデプロイメント・ディスクリプターが不要になりました。このクラスは、CalculatorLocal と CalculatorRemote という名前のローカルとリモート両方のビジネスインターフェースを実装しました。
package org.apache.geronimo.samples.slsb.calculator; import javax.ejb.Stateless; @Stateless public class Calculator implements CalculatorRemote, CalculatorLocal { public int sum(int add1, int add2) { return add1+add2; } public int multiply(int mul1, int mul2) { return mul1*mul2; } }
CalculatorLocal.java: これはローカルのビジネス・インターフェースですので、@Local アノテーションをこのクラスに任意に記述することができます。@Local や @Remote のアノテーションがないビジネス・インターフェースは、ローカル扱いになります。
package org.apache.geronimo.samples.slsb.calculator; public interface CalculatorLocal { public int sum(int add1, int add2); public int multiply(int mul1, int mul2); }
CalculatorRemote.java: これはリモートのインターフェースですので、@Remote アノテーションが必要です。
package org.apache.geronimo.samples.slsb.calculator; import javax.ejb.Remote; @Remote public interface CalculatorRemote { public int sum(int add1, int add2); public int multiply(int mul1, int mul2); }
CalculatorServlet.java: これは JSP ページのフォームを処理するためのサーブレットです。ステートレス・セッション Bean の Calculator を利用して、計算結果を返します。CalculatorLocal に記述のある @EJB アノテーションに注目してください。EJB コンテナはすべてのリクエストに対して別々の Bean のインスタンスをもちます。メモ: @EJB アノテーションは、ステートフル・セッションの場合は型階層に記述しますが、ステートレス・セッション Bean はどの階層でも宣言できます。
package org.apache.geronimo.samples.calculator; import java.io.IOException; import javax.ejb.EJB; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.geronimo.samples.slsb.calculator.CalculatorLocal; public class CalculatorServlet extends HttpServlet { @EJB private CalculatorLocal calc = null; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { String firstNumber = req.getParameter("firstNumber"); String secondNumber = req.getParameter("secondNumber"); String operation = req.getParameter("operation"); int firstInt = (firstNumber == null) ? 0 : Integer.valueOf(firstNumber).intValue(); int secondInt = (secondNumber == null) ? 0 : Integer.valueOf(secondNumber).intValue(); if ( "multiply".equals(operation) ) { req.setAttribute("result", calc.multiply(firstInt, secondInt)); } else if ( "add".equals(operation) ) { req.setAttribute("result", calc.sum(firstInt, secondInt)); } System.out.println("Result is " + req.getAttribute("result")); getServletContext().getRequestDispatcher("/sample-docu.jsp").forward(req, resp); } catch ( Exception e ) { e.printStackTrace(); throw new ServletException(e); } } }
デプロイメント・プラン
次のような構造でデプロイします。
|- calculator-stateless-ear-2.0-SNAPSHOT.ear |- META-INF |- application.xml |- geronimo-application.xml |- calculator-stateless-ejb-2.0-SNAPSHOT.jar |- calculator-stateless-war-2.0-SNAPSHOT.war
application.xml: JAR ファイルが参照され、このアプリケーションの機能を与えられます。WAR ファイルは Web ベースのインターフェースを通してこのアプリケーションが使えるようにするために参照されます。コンテキスト・ルートが /calculator-stateless となり、このアプリケーションの URL は http://<hostname>:<port>/calculator-stateless となります。
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5"> <description>Geronimo Sample EAR for Stateless Session</description> <display-name>Geronimo Sample EAR for Stateless Session</display-name> <module> <web> <web-uri>calculator-stateless-war-2.0-SNAPSHOT.war</web-uri> <context-root>/calculator-stateless</context-root> </web> </module> <module> <ejb>calculator-stateless-ejb-2.0-SNAPSHOT.jar</ejb> </module> </application>
geronimo-application.xml: このプロジェクト(モジュールには他に依存するモジュールとは違うユニークな名前をつけます)の情報が <environment> タグの中に記述されています。今回の場合は、他のモジュールに依存していませんので、リストには記述がありません。しかしながら、全体を通してユニークな名前をつけておく方がよいです。そうすれば、後々他のアプリケーションから参照できるようになります。
<?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-1.2"> <environment xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2"> <moduleId> <groupId>${pom.groupId}</groupId> <artifactId>${pom.artifactId}</artifactId> <version>${version}</version> <type>ear</type> </moduleId> </environment> <module> <web>calculator-stateless-war-${version}.war</web> <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2"> <context-root>/calculator-stateless</context-root> </web-app> </module> </application>
導入方法
- SVN からサンプルのソースコードをチェックアウトしてください。
svn checkout http://svn.apache.org/repos/asf/geronimo/samples/trunk/samples/calculator-stateless-pojo
- mvn install site コマンドを実行し、ソースコードをビルドしてください。現在のディレクトリーに calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルが作られます。
- $geronimo_home/bin ディレクトリーに移動し、Geronimo サーバを始動してください。
- この リンクをクリックし、コンソールを利用して calculator-stateless-ear-2.0-SNAPSHOT.ear ファイルをデプロイしてください。コンソールのユーザー名/パスワードは system/manager です。または、以下のコマンドを利用してデプロイしてください。
deploy --user system --password manager deploy <path to the ear file>
- この URL http://localhost:8080/calculator-stateless をクリックしてください。表示されたドキュメントを読んでください。
サンプル・アプリケーションを開くと、右隅にある "source" タブをクリックすることでソース・コードを見ることができます。"javadoc" をクリックすると JavaDoc が読めます。