Webポジョ
をステートフルにつなぐJBoss Seam


【特集】Java EE 6のWeb Beansを先取りするオープンソース

株式会社 クロノス
大石宏一
2008/8/28


利点【2】O/Rマッピング・DIによるXML地獄からの解放

 JBoss Seamでは、JSFとEJB 3.0の統合以外にもDBテーブルへのO/RマッピングやコンポーネントのDIなどにアノテーションが使えます。

リスト1 アノテーションを使ったPOJOの例
@Entity
@Pass("account")
public class Account implements Serializable {
    private int id;
    private String pass;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }
}

 初期のDIコンテナなどは、あまりにもXMLへの設定が多過ぎたために、XMLが複雑になり過ぎるという「XML hellXML地獄)」と呼ばれる状態に陥っていました。一方、JBoss Seamはアノテーションをうまく使うことによって、開発者を「XML hell」から解放しています。

利点【3】双方向のDI「バイジェクション」が可能

 JBoss Seamを使うことのメリットの1つとして挙げられるのは、DI/インジェクションをサポートするための「@In」(インジェクション)や「@Out」(アウトジェクション)といったアノテーションが用意されていることです。

リスト2 @Inアノテーションの記述例
@Name("login")
@Stateful
public class LoginAction implements Login, Serializable {
    @In private User user;
    public LoginAction() {}
}

 以下のように、EL(Expression Language)を使って、式の値をインジェクトすることもできます。

リスト3 ELを使ったインジェクションの例
@Name("login")
@Stateful
public class LoginAction implements Login, Serializable {
    @In("#{user.userName}") private String userName;
}

 @Inアノテーションはコンポーネントの任意のメソッドを実行する直前に、スコープからオブジェクトを検索し、フィールドにインジェクションします。

双方向DI、「バイジェクション」とは?

 これに対し、@Outアノテーションはメソッド実行後にオブジェクトをスコープに設定します。これはコンポーネントへの依存性の注入とは逆方向であるため、「アウトジェクション」と呼びます。さらに同じフィールドに対し@In、@Outを付加でき、これを「バイジェクション(bijection)」と呼びます。

リスト4 バイジェクションの例
@Name("login")
@Stateful
public class LoginAction implements Login, Serializable {
    @In @Out private User user;
}

利点【4】ステートフルなWebアプリケーションに最適

 JBoss Seamは状態を管理する以下のような7つのスコープを用意しています。

表 JBoss Seamが持つ7つのスコープ
スコープ 内容
Application アプリケーションの開始から終了まで(※サーブレットのApplicationスコープと同義)
Business Process ビジネス・プロセスの開始から終了まで
Session セッションの開始から終了まで(※サーブレットのSessionスコープと同義)
Conversation 対話の開始から終了まで
Event リクエストの開始から終了まで(※サーブレットのRequestスコープと同義)
Page ページの開始から終了まで
Stateless 状態を管理しない

ステートフルなConversationスコープ

 上記の中でもConversationスコープは、JBoss Seamの特徴的なスコープです。このConversationスコープはデフォルトでは、あるページからのリクエスト&レスポンスが完了した段階でConversationは破棄されます。

 これはEventスコープと同じ動作ですが、Conversationスコープとともに@Begin、@Endアノテーションを用いると、@Beginを付与したメソッドから@Endを付与したメソッドまでの状態を管理できます。@Beginを付与したメソッドを実行すると、@Endを付与したメソッドを実行するまで複数のリクエストをまたがって状態を管理します。

@Begin
public void login() {
// ……【略】……
}

@End
public void logout() {
// ……【略】……
}

 このConversationスコープのおかげで、Webブラウザの[戻る]ボタンや[リフレッシュ]ボタン、[F5]キーの2度押しへの対策を開発者が施す必要がなくなりました。例えば、Webブラウザの[戻る]ボタンを使うと、登録や更新といった2度以上実行してはならない処理を複数回実行できてしまうので、通常Webブラウザの[戻る]ボタンを無効にするなどの対策をしなければなりません。

 しかし、Conversationスコープの場合、@Endを付与したメソッドを1度実行すると、@Beginを付与したメソッドで開始したConversationスコープが終了するため、@Endを付与したメソッドを2度以上実行しないようにできます。

Conversationスコープでマルチウィンドウに対応

 また、Conversationスコープを使うと、マルチウィンドウに対応したアプリケーションを作成できます。

 同一PCから複数のWebブラウザを起動し同じWebアプリケーションにアクセスするとき、HTTPセッションでは同じセッションにアクセスしてしまいますが、Conversationスコープを使うと、それぞれのWebブラウザの状態を別々に管理できます。

編集部注:ステートフルなWebアプリケーションについて詳しく知りたい読者は、「“ステートフル”なら不要なWebプログラミングを減らせる」をご覧ください。

 次ページでは、Tomcatにもデプロイできるなど、いかにJBoss Seamが導入しやすいかについてや、まもなくリリースされる「JBoss Seam 2.0」などについて説明します。

コラム 「ポジョだとテストが容易になる?」

筆者が考える「POJOであることの最大の利点」は、テストが容易になるということです。

少なくともEJB 2までは、コンポーネントはEJBコンテナにデプロイしないと、ユニット・テスト単体テスト)ができませんでした。そもそもテスト用の環境構築が非常に複雑で面倒で、さらには、ほんの少しの修正を確認するだけでも長いデプロイ時間を待たなくてはならないという問題がありました。

SeamコンポーネントはPOJOであるため、JUnitTestNGなどのテスティング・フレームワークを使って容易にユニット・テストができます。


編集部注:JUnitなどのテスティング・フレームワークについて詳しく知りたい読者は、「EclipseとJUnitによるテスティング」をご覧ください。

 

1-2-3

 INDEX
  Page1
  EJB 2.1って使えましたか?
次期Java EEを先取りする「JBoss Seam」の利点
利点【1】アノテーションでJSFとEJBの統合が簡単に
Page2
  利点【2】O/Rマッピング・DIによるXML地獄からの解放
利点【3】双方向のDI「バイジェクション」が可能
利点【4】ステートフルなWebアプリケーションに最適
コラム 「ポジョだとテストが容易になる?」
  Page3
  利点【5】サンプルやツールの充実による導入のしやすさ
間もなく「JBoss Seam 2.0」がリリース!
今後、JBoss SeamによってEJB 3.0は普及するのか?


Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間