SeamFramework.org Community Documentation

- 前のページ
- 次のページ

## 第31章 Seam アノテーション

Seam アプリケーションを記述する場合、数多くのアノテーションを使用することになります。 Seam ではアノテーションを使用して宣言的なプログラミングを実現することができます。使用するアノテーションのほとんどは EJB 3.0 仕様で定義されています。データ検証用のアノテーションは Hibernate Validator パッケージで定義されています。そして、 Seam は Seam 独自のアノテーションセットを持っており、これについてはこの章で説明します。

これらのアノテーションはすべてパッケージ `org.jboss.seam.annotations` で定義されます。

## 31.1. コンポーネント定義のためのアノテーション

アノテーションの最初のグループでは Seam コンポーネントを定義することができます。これらのアノテーションはコンポーネントクラスで見られます。

`@Name`

      @Name("componentName")

  クラスに対して Seam コンポーネント名を定義します。このアノテーション は Seam の全コンポーネントに必要になります。

`@Scope`

      @Scope(ScopeType.CONVERSATION)

  コンポーネントのデフォルトコンテキストを定義します。 可能な値は `ScopeType` の列挙、すなわち、 `EVENT, PAGE, CONVERSATION, SESSION, BUSINESS_PROCESS, APPLICATION, STATELESS` で定義されます。

  スコープが明示的に指定されていない場合、 デフォルトはコンポーネントタイプにより異なってきます。 ステートレスセッション Bean の場合、 デフォルトは `STATELESS` になります。 エンティティ bean およびステートフルセッション Bean なら、 デフォルトは `CONVERSATION` になり、 JavaBeans のデフォルトは `EVENT` になります。

`@Role`

      @Role(name="roleName", scope=ScopeType.SESSION)

  Seam コンポーネントを複数のコンテキスト変数に結合できるようにします。 `@Name`/`@Scope` アノテーションは「デフォルトロール」を定義します。 各 `@Role` アノテーションは追加ロールを定義します。

  - `name` — コンテキスト変数名です。

  - `scope` — コンテキスト変数のスコープです。 スコープが明示的に指定されない場合、 デフォルトは上記のとおりコンポーネントタイプにより異なります。

`@Roles`

      @Roles({

              @Role(name="user", scope=ScopeType.CONVERSATION),

              @Role(name="currentUser", scope=ScopeType.SESSION)

         })

  複数の追加ロールを指定することができるようになります。

`@BypassInterceptors`

      @BypassInterceptors

  特定のコンポーネントまたはメソッドにおける、すべてのインタセプタを無効にします。

`@JndiName`

      @JndiName("my/jndi/name")

  Seam が EJB コンポーネントのルックアップに使用する JNDI 名を指定します。 JNDI 名が明示的に指定されない場合、 Seam は `org.jboss.seam.core.init.jndiPattern` で指定される JNDI パターンを使用します。

`@Conversational`

      @Conversational

  対話スコープのコンポーネントが対話用であることを指定します。つまり長期対話が起こっていない限り、そのコンポーネントのメソッドを呼ぶことができません。

`@PerNestedConversation`

      @PerNestedConversation

  対話スコープのコンポーネントのスコープを、そのコンポーネントがインスタンス化された親対話だけに制限します。そのコンポーネントのインスタンスはネストされた子対話からは見えません。子対話は独自のインスタンスを持つことになります。

  警告：これはおかしな定義です。なぜならこれは要求サイクルのある部分ではコンポーネントが見え、その後見えなくなるということを意味しています。アプリケーションでこの機能を使うことは推奨しません！

`@Startup`

      @Scope(APPLICATION) @Startup(depends="org.jboss.seam.bpm.jbpm")

  アプリケーションスコープのコンポーネントは初期化時に直ちに開始されることを指定します。 主に、 JNDI、 データソースなどの重要なインフラストラクチャをブートストラップする特定の組み込みコンポーネントに使用されます。

      @Scope(SESSION) @Startup

  セッションスコープのコンポーネントはセッション作成時に直ちに開始されることを指定します。

  - `depends` — インストールされているならば先に開始されるべき名前付きコンポーネントを指定します。

`@Install`

      @Install(false)

  コンポーネントがデフォルトでインストールされる必要があるかどうかを指定します。 `@Install` アノテーションが無い場合、コンポーネントはインストールが必要であるという意味になります。

      @Install(dependencies="org.jboss.seam.bpm.jbpm")

  コンポーネントは依存関係としてリストされているコンポーネント群もインストールされる場合にのみインストールされることを指定します。

      @Install(genericDependencies=ManagedQueueSender.class)

  特定のクラスで実装されたコンポーネントがインストールされている場合にのみ、コンポーネントがインストールされることを指定します。 依存するコンポーネントの名前が不定である場合に便利です。

      @Install(classDependencies="org.hibernate.Session")

  コンポーネントが、指定されたクラスがクラスパス内にある場合にのみインストールされることを指定します。

      @Install(precedence=BUILT_IN)

  そのコンポーネントの優先度を指定します。 同じ名前のコンポーネントが複数存在する場合、 より高い優先度を持つコンポーネントがインストールされます。 定義される優先度の値は次のとおりです (昇順) :

  - `BUILT_IN` — すべての組み込みSeamコンポーネントの優先度

  - `FRAMEWORK` — Seamを拡張するフレームワークのコンポーネントを使うための優先度

  - `APPLICATION` — アプリケーションコンポーネントの優先度（デフォルトの優先度）

  - `DEPLOYMENT` — 特定のデプロイメントにおいてアプリケーションコンポーネントを上書きするようなコンポーネントを使うための優先度

  - `MOCK` — テスト時に使うモックオブジェクトのための優先度

`@Synchronized`

      @Synchronized(timeout=1000)

  コンポーネントが複数のクライアントによって同時にアクセスされること、 Seam は要求をシリアライズすることを指定します。 要求が特定のタイムアウト期間内にコンポーネントでロックを取得できないと例外が発生します。

`@ReadOnly`

      @ReadOnly

  JavaBean コンポーネントまたはコンポーネントメソッドが呼び出しの終わりで状態の複製を必要としないことを指定します。

`@AutoCreate`

      @AutoCreate

  コンポーネントが自動的に生成されるよう指定します。クライアントが `create=true` を指定していなくても生成されます。

## 31.2. バイジェクション用アノテーション

次の二つのアノテーションはバイジェクションを制御します。 これらの属性はコンポーネントインスタンス変数またはプロパティのアクセサメソッドに指定できます。

`@In`

      @In

  コンポーネントの属性が各コンポーネント呼び出しの開始時にコンテキスト変数からインジェクトされることを指定します。 コンテキスト変数が null の場合、 例外が発生します。

      @In(required=false)

  コンポーネントの属性が各コンポーネント呼び出しの開始時にコンテキスト変数からインジェクトされることを指定します。 コンテキスト変数は null でも構いません。

      @In(create=true)

  コンポーネント属性がコンポーネント呼び出しの開始時にコンテキスト変数からインジェクトされることを指定します。コンテキスト変数が null の場合、コンポーネントのインスタンスが Seam によって生成されます。

      @In(value="contextVariableName")

  アノテーションを付けられたインスタンス変数名を使用せず、 コンテキスト変数名を明示的に指定します。

      @In(value="#{customer.addresses['shipping']}")

  コンポーネント属性が各コンポーネント呼び出しの開始時に JSF EL 式を評価することでインジェクトされることを指定します。

  - `value` — コンテキスト変数名を指定します。デフォルトはコンポーネント属性の名前です。あるいは `#{...}` で囲まれた JSF EL 式を指定します。

  - `create` — コンテキスト変数がすべてのコンテキストで未定義 (null) の場合、 Seam がコンテキスト変数として同じ名前でコンポーネントをインスタンス化するよう指定します。デフォルトは false です。

  - `required` — コンテキスト変数がすべてのコンテキストで未定義の場合、 Seam が例外をスローするよう指定します。

`@Out`

      @Out

  Seam コンポーネントであるコンポーネント属性が呼び出しの終わりでそのコンテキスト変数にアウトジェクトされることを指定します。 属性が null の場合、 例外が発生します。

      @Out(required=false)

  Seam コンポーネントであるコンポーネント属性が呼び出しの終わりでそのコンテキスト変数にアウトジェクトされることを指定します。 属性は null でも構いません。

      @Out(scope=ScopeType.SESSION)

  Seam コンポーネントタイプではないコンポーネント属性が呼び出しの終わりで特定スコープにアウトジェクトされることを指定します。

  明示的にスコープが指定されていない場合、 代わりに `@Out` 属性を持つコンポーネント自体のスコープが使用されます (またはコンポーネントがステートレスであれば `EVENT`) 。

      @Out(value="contextVariableName")

  アノテーションを付けられたインスタンス変数名を使用せず、 コンテキスト変数名を明示的に指定します。

  - `value` — コンテキスト変数名を指定します。デフォルトはコンポーネント属性の名前です。

  - `required` — アウトジェクトする際にコンポーネント属性が null だった場合、 Seam が例外をスローするよう指定します。

これらのアノテーションは同時に利用されます。 例:

    @In(create=true) @Out private User currentUser;

次のアノテーションは マネージャコンポーネント パターンをサポートします。Seam コンポーネントはインジェクトされる他のいくつかのクラスのインスタンスのライフサイクルを管理します。コンポーネントの getter メソッドで指定されます。

`@Unwrap`

      @Unwrap

  このアノテーションが付いている getter メソッドにより返されるオブジェクトが、コンポーネントインスタンス自体の代わりにインジェクトされます。

次のアノテーションは ファクトリコンポーネント パターンをサポートします。 Seam コンポーネントはコンテキスト変数の値の初期化を行います。 特に非 Faces 要求に対する応答のレンダリングに必要なあらゆる状態の初期化に便利です。 コンポーネントメソッドで指定されます。

`@Factory`

      @Factory("processInstance") public void createProcessInstance() { ... }

  コンテキスト変数に値がない場合に、 このコンポーネントのメソッドが指定コンテキスト変数の値の初期化に使用されることを指定します。 このスタイルは `void` を返すメソッドと併用します。

      @Factory("processInstance", scope=CONVERSATION) public ProcessInstance createProcessInstance() { ... }

  コンテキスト変数に値がない場合、 Seam が指定コンテキスト変数の値の初期化に使用する値をこのメソッドが返すことを指定します。 このスタイルは値を返すメソッドと併用します。 明示的にスコープが指定されていない場合、 `@Factory` メソッドを持つコンポーネント自体のスコープが使用されます (そのコンポーネントがステートレスではない場合。 コンポーネントがステートレスの場合は`EVENT` コンテキストが使用されます) 。

  - `value` — コンテキスト変数の名前を指定します。メソッドが getter メソッドの場合、 JavaBeans のプロパティ名がデフォルトになります。

  - `scope` — Seamが戻り値をバインドするスコープを指定します。値を返すファクトリメソッドに取ってのみ、意味があります。

  - `autoCreate` — 変数が要求されたときにはいつもこのファクトリメソッドが自動的に呼ばれるよう指定します。`@In` が `create=true` を指定していない場合でも呼ばれます。

`Log` をインジェクトするアノテーション:

`@Logger`

      @Logger("categoryName")

  コンポーネントフィールドに `org.jboss.seam.log.Log` のインスタンスをインジェクトします。 エンティティ Bean の場合、 このフィールドは static として宣言されなければなりません。

  - `value` — ログカテゴリの名前を指定します。デフォルトはコンポーネントのクラス名です。

最後のアノテーションは、要求パラメータ値をインジェクトします:

`@RequestParameter`

      @RequestParameter("parameterName")

  コンポーネントの属性に要求パラメータ値をインジェクトします。 基本的な対話は自動的に開始されます。

  - `value` — 要求パラメータの名前を指定します。デフォルトはコンポーネント属性の名前です。

## 31.3. コンポーネントのライフサイクルメソッド用アノテーション

これらのアノテーションにより、 コンポーネントがそのコンポーネント自体のライフサイクルイベントに対して反応することができるようになります。 各コンポーネントクラスごとにそれぞれ一つのアノテーションのみ定義できます。

`@Create`

      @Create

  コンポーネントのインスタンスが Seam によってインスタンス化されたときに呼び出されるメソッドを指定します。 create メソッドは JavaBeans およびステートフルセッション Bean に対してしかサポートされないので注意してください。

`@Destroy`

      @Destroy

  コンテキストが終了し、そのコンテキスト変数が破棄されるときに呼び出されるメソッドを指定します。 destroy メソッドは JavaBeans およびステートフルセッション Bean に対してしかサポートされないので注意してください。

  Destroy メソッドはクリーンアップにのみ使用するようにしてください。 Seam は destroy メソッドから伝播する例外はすべてキャッチしてログを出力し、捨ててしまいます。

`@Observer`

      @Observer("somethingChanged")

  指定されたタイプのコンポーネント駆動イベントが発生すると、このメソッドが呼び出されます。

      @Observer(value="somethingChanged",create=false)

  指定したタイプのイベントが発生したときにそのメソッドが呼ばれるよう指定します。ただしインスタンスが存在しない場合に、それを生成することはしません。インスタンスが存在せず、 create が false の場合、イベントは監視されません。create のデフォルト値は true です。

## 31.4. コンテキスト境界用アノテーション

これらのアノテーションは宣言的対話の境界を設定します。 これらは Seam コンポーネントのメソッド上、通常はアクションリスナーメソッドに付与されます。

すべての Web 要求はそれに関連する対話的コンテキストを持っています。 ほとんどの対話は要求の終了と同時に終了します。 複数の要求にわたる対話が必要であれば、`@Begin` を付けたメソッドを呼び出すことで、 長期対話 (long-running conversation) に昇格させなければなりません。

`@Begin`

      @Begin

  このメソッドが例外および null 以外の結果 (outcome) を返したら長期対話が開始することを指定します。

      @Begin(join=true)

  長期対話がすでに開始されている場合、 対話コンテキストが単に伝播されることを指定します。

      @Begin(nested=true)

  長期対話がすでに開始されている場合、 新たにネストされた対話コンテキストが開始することを指定します。 次の `@End` が出現したときにネストされた対話が終了し、外側の対話が再開します。同じ外側の対話において、複数のネストされた対話が同時に存在することは全く問題ありません。

      @Begin(pageflow="process definition name")

  この対話のためのページフローを定義する jBPM プロセス定義の名前を定義します。

      @Begin(flushMode=FlushModeType.MANUAL)

  Seam 管理の永続コンテキストのフラッシュモードを指定します。 `flushMode=FlushModeType.MANUAL` は アトミックな対話 (atomic conversation) をサポートします。 この場合、 `flush ()` (通常、 対話終了時に呼び出される) の明示的な呼び出しが起きるまで、 すべての書き込み操作は対話コンテキスト内にキューイングされます。

  - `join` — 長期対話が既に始まっている場合の動作を指定します。`true` ならば、コンテキストが伝播されます。 `false` ならば、例外がスローされます。デフォルトは `false` です。`nested=true` が指定されている場合は、この設定は無視されます。

  - `nested` — 長期対話が既に開始されている場合、ネストした対話が開始されることを指定します。

  - `flushMode` — この対話で作成される Seam 管理の Hibernate セッション、または JPA 永続コンテキストのフラッシュモードをセットします。

  - `pageflow` — `org.jboss.seam.bpm.jbpm.pageflowDefinitions` によってデプロイされた jBPM プロセス定義のプロセス定義名です。

`@End`

      @End

  このメソッドが例外および null 以外の結果 (outcome) を返す場合、 長期対話が終了することを指定します。

  - `beforeRedirect` — デフォルトでは、リダイレクトが発生するまで、対話は実際には破棄されません。`beforeRedirect=true` をセットすることで、現在の要求の最後に対話が破棄され、リダイレクトは新しい一時的な対話コンテキストで実行されるよう指定します。

  - `root` — デフォルトでは、ネストした対話が終了すると対話のスタックを単純にポップして、外側の対話を再開します。`root=true` をセットすることで 、ルート対話が破棄され、結果的に対話スタック全体が破棄されるよう指定します。対話がネストしていなければ単純に現在の対話が終了します。

`@StartTask`

      @StartTask

  jBPM タスクを「開始」します。 このメソッドが例外および null 以外の結果 (outcome) を返すとき、 長期対話を開始することを指定します。 この対話は指定の要求パラメータ中で指定される jBPM タスクと関連しています。 この対話のコンテキスト内で、 タスクインスタンスのビジネスプロセスインスタンスに対して、 ビジネスプロセスコンテキストも定義されます。

  - jBPM `TaskInstance` は、 `taskInstance` という名前の要求コンテキスト変数として利用可能です。 jBPM `ProcessInstance` は、 `processInstance` という名前の要求コンテキスト変数として利用可能です。 (もちろん、これらのオブジェクトは `@In` でインジェクションが可能です。)

  - `taskIdParameter` — タスクのIDを持つ要求パラメータの名前です。デフォルトは `"taskId"` です。これは Seam `taskList` JSF コンポーネントでもデフォルトとして使用されています。

  - `flushMode` — この対話で作成される Seam 管理の Hibernate セッション、または JPA 永続コンテキストのフラッシュモードをセットします。

`@BeginTask`

      @BeginTask

  完了していない jBPM タスクの処理を再開します。 このメソッドが例外および null 以外の結果 (outcome) を返すとき、 長期対話が開始することを指定します。 この対話は指定の要求パラメータ中で指定される jBPM タスクと関連しています。 この対話のコンテキスト内で、 タスクインスタンスのビジネスプロセスインスタンスに対して、 ビジネスプロセスコンテキストも定義されます。

  - jBPM `org.jbpm.taskmgmt.exe.TaskInstance` は、 `taskInstance` という名前の要求コンテキスト変数として利用可能です。 jBPM `org.jbpm.graph.exe.ProcessInstance` は、 `processInstance` という名前の要求コンテキスト変数として利用可能です。

  - `taskIdParameter` — タスクのIDを持つ要求パラメータの名前です。デフォルトは `"taskId"` です。これは Seam `taskList` JSF コンポーネントでもデフォルトとして使用されています。

  - `flushMode` — この対話で作成される Seam 管理の Hibernate セッション、または JPA 永続コンテキストのフラッシュモードをセットします。

`@EndTask`

      @EndTask

  jBPM タスクを「終了」します。 このメソッドが null 以外の結果 (outcome) を返すとき、 長期対話は終了し、 現在のタスクが完了することを指定します。 jBPM 遷移を引き起こします。 アプリケーションが `transition` と呼ばれる組み込みコンポーネントの `Transition.setName ()` を呼んでいない限り、 引き起こされる実際の遷移はデフォルトの遷移になります。

      @EndTask(transition="transitionName")

  指定された jBPM 遷移を引き起こします。

  - `transition` — タスクが終了するときに引き起こされる jBPM 遷移の名前です。 省略された場合はデフォルト遷移となります。

  - `beforeRedirect` — デフォルトでは、リダイレクトが発生するまで、対話は実際には破棄されません。`beforeRedirect=true` をセットすることで、現在の要求の最後に対話が破棄され、リダイレクトは新しい一時的な対話コンテキストで実行されるよう指定します。

`@CreateProcess`

      @CreateProcess(definition="process definition name")

  メソッドが例外なしに null 以外の結果 (outcome) を返すとき、 新しい jBPM プロセスインスタンスを作成します。 `ProcessInstance` オブジェクトは `processInstance` というコンテキスト変数として使用できます。

  - `definition` — `org.jboss.seam.bpm.jbpm.processDefinitions` によってデプロイされる jBPM プロセス定義の名前です。

`@ResumeProcess`

      @ResumeProcess(processIdParameter="processId")

  メソッドが例外または null 以外の結果 (outcome) を返すとき、 既存の jBPM プロセスインスタンスのスコープに再度入ります。 `ProcessInstance` オブジェクトは `processInstance` というコンテキスト変数で使用できます。

  - `processIdParameter` — プロセス ID を持つ要求パラメータ名です。デフォルトは `"processId"` です。

`@Transition`

      @Transition("cancel")

  メソッドが null 以外の結果を返すときはいつも、現在の jBPM プロセスインスタンス内で遷移にシグナルを送るように、メソッドをマークします。

## 31.5. J2EE 環境で Seam JavaBean コンポーネントを使用するためのアノテーション

Seam は特定のアクションリスナーの結果 (outcome) に対して JTA トランザクションのロールバックを強制するアノテーションを提供します。

`@Transactional`

      @Transactional

  JavaBean コンポーネントにセッション Bean コンポーネントのデフォルト動作と同じようなトランザクション動作を持たせることを指定します。 例えば、 メソッド呼び出しはトランザクション内で起こるべきであり、 メソッドが呼び出されたときにトランザクションが存在しない場合は、 トランザクションがそのメソッドのためだけに開始されます。 このアノテーションはクラスレベルでもメソッドレベルでも適用可能です。

  EJB 3.0 コンポーネントではこのアノテーションを使わずに、 `@TransactionAttribute` を使ってください！

`@ApplicationException`

      @ApplicationException

  javax.ejb.ApplicationException と同義で、Java EE 5 より前の環境で使用されます。例外に対して適用され、それがアプリケーション例外であり、クライアントに直接(つまりラップせずに)伝えられるべきであるということを指定します。

  EJB 3.0 コンポーネントではこのアノテーションを使わずに、`@javax.ejb.ApplicationException` を代わりに使ってください。

  - `rollback` — デフォルトでは `false` です。`true` の場合、この例外はトランザクションを rollback only にセットします。

  - `end` — デフォルトでは `false` です。`true` の場合、この例外は現在の長期対話を終了します。

`@Interceptors`

      @Interceptors({DVDInterceptor, CDInterceptor})

  javax.interceptors.Interceptors と同義で、Java EE 5 より前の環境で使用されます。これはメタアノテーションとしてのみ使用できることに注意してください。クラスまたはメソッドに対して、インタセプタの順序付けられたリストを宣言します。

  EJB 3.0 コンポーネントではこのアノテーションを使わずに、`@javax.interceptor.Interceptors` を代わりに使ってください。

これらのアノテーションは主に JavaBean Seam コンポーネントに対して有用です。EJB 3.0 コンポーネントを使う場合は、標準 Java EE5 アノテーションを使うべきです。

## 31.6. 例外用のアノテーション

これらのアノテーションにより Seam コンポーネントから伝播する例外を処理する方法を指定することができます。

`@Redirect`

      @Redirect(viewId="error.jsp")

  このアノテーション付いている例外は、指定されたビュー ID にブラウザをリダイレクトします。

  - `viewId` — リダイレクトする JSF ビュー ID です。ここで EL も利用可能です。

  - `message` — 表示するメッセージです。 デフォルトはその例外のメッセージです。

  - `end` — 長期対話が終了するよう指定します。 デフォルトは `false` です。

`@HttpError`

      @HttpError(errorCode=404)

  このアノテーションが付いている例外は、 HTTP エラーが送信されます。

  - `errorCode` — HTTP エラーコードです。 デフォルトは `500` です。

  - `message` — HTTP エラーで送信されるメッセージです。 デフォルトはその例外のメッセージです。

  - `end` — 長期対話が終了するよう指定します。 デフォルトは `false` です。

## 31.7. Seam Remoting用のアノテーション

Seam Remotingは、以下のアノテーションを付けた セッション Bean のローカルインタフェースが必要です。

`@WebRemote`

      @WebRemote(exclude="path.to.exclude")

  このアノテーション付きのメソッドはクライアントサイドの JavaScript から呼ばれる可能性があることを示しています。`exclude` プロパティはオプションで、 オブジェクトがその結果のオブジェクトグラフから除外されるようにすることができます (詳細は 章 25. リモーティング の章を参照)。

## 31.8. Seam インタセプタ用のアノテーション

以下のアノテーションは、Seam インタセプタクラスで使われます。

EJB インタセプタ定義に必要なアノテーションに関する詳細は EJB 3.0 仕様のドキュメントを参照してください。

`@Interceptor`

      @Interceptor(stateless=true)

  このインタセプタはステートレスであることを指定するので、 Seam は複製処理を最適化することができます。

      @Interceptor(type=CLIENT)

  このインタセプタは EJB コンテナより前に呼ばれる「クライアントサイド」インタセプタであることを指定します。

      @Interceptor(around={SomeInterceptor.class, OtherInterceptor.class})

  このインタセプタは特定のインタセプタよりスタック内でより高い位置に配置されることを指定します。

      @Interceptor(within={SomeInterceptor.class, OtherInterceptor.class})

  このインタセプタは特定のインタセプタよりスタック内でより深い位置に配置されることを指定します。

## 31.9. 非同期用のアノテーション

次のアノテーションは非同期メソッドの宣言に使用されます。 例:

    @Asynchronous public void scheduleAlert(Alert alert, @Expiration Date date) { ... }

    @Asynchronous public Timer scheduleAlerts(Alert alert,

       @Expiration Date date,

       @IntervalDuration long interval) { ... }

`@Asynchronous`

      @Asynchronous

  メソッド呼び出しが非同期で処理されることを指定します。

`@Duration`

      @Duration

  非同期呼び出しのパラメータが、 その呼び出しが処理されるまでの期間であることを指定します (または反復呼び出しの場合は初めての処理が行われるまで) 。

`@Expiration`

      @Expiration

  非同期呼び出しのパラメータが、 その呼び出しが処理される (または反復呼び出しの場合は初めての処理が行われる) 日付と時刻であることを指定します。

`@IntervalDuration`

      @IntervalDuration

  このアノテーションが付いている反復呼び出しを行う非同期メソッド呼び出しのパラメータが、 各反復呼び出し間の期間であることを指定します。

## 31.10. JSF と使用するアノテーション

以下のアノテーションで JSF をより簡単に使えるようになります。

`@Converter`

  Seam コンポーネントを JSF コンバータとして振る舞えるようにします。アノテーションを付けられたクラスは Seam コンポーネントでなければいけません。また `javax.faces.convert.Converter` を実装しなければなりません。

  - `id` — JSF コンバータIDです。デフォルトはコンポーネント名です。

  - `forClass` — 指定されていれば、このコンポーネントをある型のデフォルトコンバータとして登録します。

`@Validator`

  Seam コンポーネントを JSF バリデータとして振る舞えるようにします。アノテーションを付けられたクラスは Seam コンポーネントでなければいけません。また `javax.faces.validator.Validator` を実装しなければなりません。

  - `id` — JSF バリデータIDです。デフォルトはコンポーネント名です。

### 31.10.1. `dataTable` と使用するアノテーション

以下のアノテーションはステートフルセッション Bean を使ったクリック可能リストの実装を容易にします。 これらのアノテーションは属性に付与されます。

`@DataModel`

      @DataModel("variableName")

  `List`, `Map`, `Set` または `Object[]` 型のプロパティを JSF `DataModel` として、所有しているコンポーネントのスコープへアウトジェクトします(所有しているコンポーネントが `STATELESS` の場合は `EVENT` スコープ)。`Map` の場合、`DataModel` の各行は `Map.Entry` です。

  - `value` — 対話コンテキスト変数の名前です。デフォルトは属性の名前です。

  - `scope` — `scope=ScopeType.PAGE` が明示的に指定されていれば、`DataModel` は `PAGE` コンテキストに保持されます。

`@DataModelSelection`

      @DataModelSelection

  JSF `DataModel` から選択された値をインジェクトします(これは DataModel の Collection の要素、または Map の値です)。コンポーネントにひとつしか `@DataModel` 属性が定義されていなければ、その `DataModel` から選択された値がインジェクトされます。そうでなければ、各 `@DataModel` のコンポーネント名を、各 `@DataModelSelection` の value 属性に指定しなければいけません。

  関連付けられた `@DataModel` に `PAGE` スコープが指定されている場合、 DataModel Selection がインジェクトされるのに加え、関連付けられた DataModel もインジェクトされます。このとき、`@DataModel` でアノテーションを付けられたプロパティが getter メソッドだった場合、プロパティの setter メソッドも Seam コンポーネントのビジネスAPIでなければいけません。

  - `value` — 対話コンテキスト変数の名前です。コンポーネントに一つの `@DataModel` しかない場合は不要です。

`@DataModelSelectionIndex`

      @DataModelSelectionIndex

  JSF `DataModel` の選択されたインデックスをコンポーネントの属性として公開します(これは DataModel の Collection の行番号、または Map のキーです)。コンポーネントにひとつしか `@DataModel` 属性が定義されていなければ、その `DataModel` から選択された値がインジェクトされます。そうでなければ、各 `@DataModel` のコンポーネント名を、各 `@DataModelSelectionIndex` の value 属性に指定しなければいけません。

  - `value` — 対話コンテキスト変数の名前です。コンポーネントに一つの `@DataModel` しかない場合は不要です。

## 31.11. データバインディング用のメタアノテーション

これらのメタアノテーションは、リスト以外のデータ構造に対して `@DataModel` や `@DataModelSelection` と同様の機能の実装を可能にします。

`@DataBinderClass`

      @DataBinderClass(DataModelBinder.class)

  アノテーションがデータバインディングのアノテーションであることを指定します。

`@DataSelectorClass`

      @DataSelectorClass(DataModelSelector.class)

  アノテーションがデータ選択のアノテーションであることを指定します。

## 31.12. パッケージング用のアノテーション

このアノテーションは、 一緒にパッケージングするコンポーネントセットに関する情報を宣言するメカニズムを提供します。 どの Java パッケージに対しても適用できます。

`@Namespace`

      @Namespace(value="http://jboss.com/products/seam/example/seampay")

  現在のパッケージにあるコンポーネントが特定の名前空間に関連付けられることを指定します。 宣言された名前空間は `components.xml` ファイル内で XML 名前空間として使用することでアプリケーションの設定を単純化することができます。

      @Namespace(value="http://jboss.com/products/seam/core", prefix="org.jboss.seam.core")

  名前空間を特定のパッケージに関連付けるよう指定します。 また、 XML ファイル内で指定されたコンポーネント名にプレフィックスを適用するよう指定します。 たとえば、 この名前空間に関連付けられる `init` という XML 要素は実際には `org.jboss.seam.core.init` というコンポーネントを参照するように解釈されます。

## 31.13. サーブレットコンテナと統合するためのアノテーション

これらのアノテーションは Seam コンポーネントをサーブレットコンテナに統合することができます。

`@Filter`

  `@Filter` でアノテーションを付けられた Seam コンポーネント (`javax.servlet.Filter` を実装している) をサーブレットフィルタとして使います。Seam のマスタフィルタから実行されます。

  -     @Filter(around={"seamComponent", "otherSeamComponent"})

    このフィルタは特定のフィルタよりスタック内でより高い位置に配置されることを指定します。

  -     @Filter(within={"seamComponent", "otherSeamComponent"})

    このフィルタは特定のフィルタよりスタック内でより深い位置に配置されることを指定します。

- 前のページ第30章 Seam の設定と Seam アプリケーションのパッケージング
- 上に戻る
- ホーム
- 次のページ第32章 組み込み Seam コンポーネント