SeamFramework.orgCommunity Documentation

第31章 Seam アノテーション

31.1. コンポーネント定義のためのアノテーション
31.2. バイジェクション用アノテーション
31.3. コンポーネントのライフサイクルメソッド用アノテーション
31.4. コンテキスト境界用アノテーション
31.5. J2EE 環境で Seam JavaBean コンポーネントを使用するためのアノテーション
31.6. 例外用のアノテーション
31.7. Seam Remoting用のアノテーション
31.8. Seam インタセプタ用のアノテーション
31.9. 非同期用のアノテーション
31.10. JSF と使用するアノテーション
31.10.1. dataTable と使用するアノテーション
31.11. データバインディング用のメタアノテーション
31.12. パッケージング用のアノテーション
31.13. サーブレットコンテナと統合するためのアノテーション

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

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

アノテーションの最初のグループでは 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 アノテーションは追加ロールを定義します。

@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

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

@Install
@Install(false)

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

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

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

@Install(genericDependencies=ManagedQueueSender.class)

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

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

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

@Install(precedence=BUILT_IN)

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

@Synchronized
@Synchronized(timeout=1000)

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

@ReadOnly
@ReadOnly

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

@AutoCreate
@AutoCreate

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

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

@In
@In

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

@In(required=false)

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

@In(create=true)

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

@In(value="contextVariableName")

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

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

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

@Out
@Out

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

@Out(required=false)

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

@Out(scope=ScopeType.SESSION)

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

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

@Out(value="contextVariableName")

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

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

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

The next annotation supports the manager component pattern; a Seam component manages the lifecycle of an instance of some other class that is to be injected. It appears on a component getter method.

The next annotation supports the factory component pattern; a Seam component is responsible for initializing the value of a context variable. This is especially useful for initializing any state needed for rendering the response to a non-faces request. It appears on a component method.

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

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

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

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

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

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

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

これらのアノテーションは宣言的対話の境界を設定します。 これらは 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 永続コンテキストのフラッシュモードをセットします。

  • pagefloworg.jboss.seam.bpm.jbpm.pageflowDefinitions によってデプロイされた jBPM プロセス定義のプロセス定義名です。

@End
@End

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

@StartTask
@StartTask

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

@BeginTask
@BeginTask

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

@EndTask
@EndTask

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

@EndTask(transition="transitionName")

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

@CreateProcess
@CreateProcess(definition="process definition name")

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

@ResumeProcess
@ResumeProcess(processIdParameter="processId")

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

@Transition
@Transition("cancel")

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

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 を代わりに使ってください

@Interceptors
@Interceptors({DVDInterceptor, CDInterceptor})

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

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

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

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

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

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

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

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

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

   @Expiration Date date, 
   @IntervalDuration long interval) { ... }

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

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

@DataModel
@DataModel("variableName")

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

@DataModelSelection
@DataModelSelection

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

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

@DataModelSelectionIndex
@DataModelSelectionIndex

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

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

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

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