Java EE 7 検証環境をつくる EJB編
ここまで、
- Java EE 7 を試すために CentOS に GlassFish をインストール
- Ubuntu に GlassFish v4 による Java EE 7 検証環境をつくる
- Ubuntu に Spring Tool Suite を入れて Java EE 7 検証環境をつくる
- Java EE 7 検証環境をつくる REST Webサービス
なんとかかんとか、RESTサービスの環境ができたので、次はEJB環境を設定する。
EJB自体は、今から15年くらい前になるかな。訳もわからず仕事で触ったきり、ややこしい、おそい、使えないという感触だけ残してそれから触っていない。
しかしながら、Beginning Java EE 6 GlassFish 3で始めるエンタープライズJava (Programmer’s SELECTION) をざっと読んでみたところ、この15年の間に結構使えるようになっているようだ。
まずは、概要を上記の本からまとめてみる。
1.EJBの概要
EJB(Enterprise Java Beans)とは、ビジネスロジックをカプセル化し、トランザクションとセキュリティを扱うサーバーサイドのコンポーネント。
POJOにアノテーションを付加するだけで使用可能になる。
- アプリケーションの永続性レイヤーをプレゼンテーション・レイヤーから分離するには、ビジネス・レイヤーが必要。
- ビジネス・レイヤーに、ビジネスロジックを実装し、トランザクション管理とセキュリティを追加する。
- Java EEでは、ビジネス・レイヤーの実装に Enterprise Java Beans(EJB)を使用する。
- ドメインクラスのモデル化では通常名詞(Artist、CD、Book、Customerなど)を定義する。このレイヤーの上位にビジネス・レイヤーを配置しアプリケーションの処理をモデル化する。これらは通常動詞(書籍を購入する、書籍を配送する など)として定義する。
- ビジネス・レイヤーは外部Webサービス(SOAP Webサービスや、REST Webサービス)と相互作用し、他のシステムに非同期メッセージなどを送ったりする。
- また、Webインターフェースやバッチ処理、外部システムなどのクライアントへのエンドポイントとして機能するだけではなく、データベースから外部システムにかけて複数のコンポーネントを統合し、トランザクションとセキュリティの境界となる中心的な場所として機能する。」
1.1 以下のような機能
- メッセージング
- スケジューリング
- リモートアクセス
- Webサービスのエンドポイント(SOAPとREST)
- 依存性注入
- コンポーネントのライフサイクル
- インターセプタによるAOP
1.2 また、以下の様なJava SE、EEのテクノロジーとシームレスに統合
- JDBC
- JavaMail
- JavaトランザクションAPI(JTA)
- Javaメッセージングサービス(JMS)
- Java Authentication and Authorization Service(JAAS)
- Java Naming and Directory Interface(JNDI)
- Remote Method Invocation(RMI)
こうした技術的に複雑な機能はコンテナが処理するため、EJB開発者はビジネスロジックの開発に専念できる。
2.セッションBean
セッションBeanは、ビジネスロジック、プロセス、ワークフローを実装するのに最適。
ただし、事前に種類を指定する必要がある。
種類 | 内容 |
ステートレス | 複数のメソッド間で対話状態を保持しないセッションBean。任意のインスタンスを任意のクライアントに利用できる。 |
ステートフル | 対話状態を保持するセッションBean。一人のユーザーが関与する複数のメソッドで対話状態を保持しなければならない。 |
シングルトン | 複数のクライアントが共有し、同時アクセスをサポートする1つのセッションBean。 |
これらのプログラミングモデルは共通、インターフェースを持たないことも、ローカルまたはリモートインターフェースを持つことも可能。コンテナ管理のコンポーネントなので、アーカイブ(jar、war、ear)にパッケージしてコンテナにデプロイする必要がある。コンテナは、ライフサイクル、トランザクション、インターセプターを管理。
3.依存性注入
EJBは依存性注入を使用して、様々な種類のリソースにアクセスします。
@EJB アノテーションを利用して、EJBの参照をクライアントに注入します。
インジェクションはデプロイ時に行われます。
4. 実際に作成
4.1 EJBプロジェクトの作成
プロジェクトの作成から、EJB プロジェクトを作成する
EAR membership の Add project to an EAR にチェックを入れて、EARに追加する。
作成後の様子
EARの下のBundle Library に EJB の jar が出現。
4.2 EJB クラスの作成
最初なのでウィザードを使って、セッションBeanを作成してみる。
Stateless を選択して、後はデフォルトのまますすむ。
4.3 EJBのコード
ejbModule ディレクトリ以下に、クラスが作成されるので、メッセージを返すメソッドを追加する。
package info.typea.tallarico.ejb; import javax.ejb.LocalBean; import javax.ejb.Stateless; /** * Session Bean implementation class GreetEjb */ @Stateless @LocalBean public class GreetEjb { /** * Default constructor. */ public GreetEjb() { // TODO Auto-generated constructor stub } public String getGreet() { return "Hello EJB!"; } }
4.4 RESTサービスのインターフェースから呼び出す
作成した、REST サービスのエンドポイントから、EJBを呼び出すように変更する。
RESTサービスプロジェクトのビルドパスで、EJBプロジェクトの参照設定を行い、以下のようにコードを修正。
- @Stateless アノテーションを付与することで、こいつもEJBに(ないとエラーになる。理屈は今ひとつまだ把握していない)
- 作成したEJBをメンバーとして宣言し、@EJBアノテーションをつける。これで、コンテナがインジェクションしてくれる。
- メッセージの内容をEJBから取得するように書き換える。
package info.typea.tallarico.rest; import info.typea.tallarico.ejb.GreetEjb; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Stateless @Path("/hello") public class Hello { @EJB private GreetEjb greetEjb; @GET @Produces(MediaType.TEXT_HTML) public String greet() { return "<html><h1>" + greetEjb.getGreet() + "</h1>"; } }
4.5 実行
成功!!
今回は、以外と簡単に動いてくれた!まずは助かる。
この本は、わかりやすくていい!Java EE 6 の本だが、Java EE 7 自体が、Java EE 6 + なにがし、とのことなので、まずは Java EE 6 をおぼえるべしと、中の人もいっていた。