Java EE 7 検証環境をつくる EJB編

ここまで、

  1. Java EE 7 を試すために CentOS に GlassFish をインストール
  2. Ubuntu に GlassFish v4 による Java EE 7 検証環境をつくる
  3. Ubuntu に Spring Tool Suite を入れて Java EE 7 検証環境をつくる
  4. 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 プロジェクトを作成する

ejb_project01

EAR membership の Add project to an EAR にチェックを入れて、EARに追加する。

ejb_project02

作成後の様子

ejb_project03

EARの下のBundle Library に EJB の jar が出現。

4.2 EJB クラスの作成

最初なのでウィザードを使って、セッションBeanを作成してみる。

Stateless  を選択して、後はデフォルトのまますすむ。

create_session_bean01

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 実行

ejb_success

成功!!

今回は、以外と簡単に動いてくれた!まずは助かる。

この本は、わかりやすくていい!Java EE 6 の本だが、Java EE 7 自体が、Java EE 6 + なにがし、とのことなので、まずは Java EE 6 をおぼえるべしと、中の人もいっていた。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です