アノテーション型 ConversationScoped
@TargetSE({TYPESE,METHODSE,FIELDSE}) @RetentionSE(RUNTIMESE) @DocumentedSE @NormalScope(passivating=true) @InheritedSE public @interface ConversationScoped
Bean が会話スコープであることを指定します。
ConversationScoped
は、仕様で必要とされる組み込みの会話コンテキストに関連付ける必要がありますが、サードパーティの拡張機能は、それを独自のコンテキストに関連付けることもできます。以下で説明する動作は、組み込みの会話コンテキストにのみ関連しています。会話スコープがアクティブです:
- すべてのサーブレットリクエスト中。
会話コンテキストが初期化されると修飾子
@Initialized(ConversationScoped.class)
を持つイベントが発生し、会話が破棄されると修飾子@Destroyed(ConversationScoped.class)
を持つイベントが発生します。イベントペイロードは次のとおりです。- 会話コンテキストが破棄され、現在のサーブレットリクエストに関連付けられていない場合は、会話 ID、または
- アプリケーションがサーブレットコンテナーにデプロイされた Web アプリケーションである場合は
ServletRequest
、または - 他のタイプのアプリケーション用の任意の
java.lang.Object
。
会話コンテキストは、特定の会話に関連付けられた状態へのアクセスを提供します。すべてのサーブレットリクエストには、関連する会話があります。この関連付けは、次のルールに従ってコンテナーによって自動的に管理されます。
- サーブレットリクエストには、1 つの会話が関連付けられています。
- コンテナーは、「CDI 会話フィルター」という名前のフィルターを提供します。これは
web.xml
にマッピングでき、会話がサーブレットリクエストに関連付けられているときにユーザーが変更できるようにします。このフィルターがアプリケーションのweb.xml
にマップされていない場合、サーブレットリクエストに関連付けられた会話は、リクエストの開始時に決定されてから、Web アプリケーションのサーブレットのservice()
メソッドを呼び出し、サーブレットフィルターのdoFilter()
メソッドを呼び出します。Web アプリケーションであり、コンテナーが Web アプリケーション内のServletRequestListener
またはAsyncListener
を呼び出す前。
会話は、一時的または長時間実行の 2 つの状態のいずれかになります。
- デフォルトでは、会話は一時的なものです
- 一時的な会話は、
Conversation.begin()
を呼び出すことによって長時間実行とマークされる場合があります Conversation.end()
を呼び出すことにより、長時間実行される会話に一時的なマークを付けることができます。
長時間実行されるすべての会話には、文字列値の一意の識別子があります。これは、会話が長時間実行とマークされたときにアプリケーションによって設定されるか、コンテナーによって生成されます。
現在のサーブレットリクエストに関連付けられている会話がサーブレットリクエストの終了時に一時的な状態にある場合、破棄され、会話コンテキストも破棄されます。
現在のサーブレットリクエストに関連付けられた会話が、サーブレットリクエストの終了時に長時間実行状態にある場合、その会話は破棄されません。リクエストに関連付けられた長時間実行される会話は、会話の一意の識別子を含む
cid
という名前のリクエストパラメーターを使用して、任意のサーブレットリクエストに伝播できます。この場合、アプリケーションはこのリクエストパラメーターを管理する必要があります。現在のサーブレットリクエストが JSF リクエストであり、会話が長時間実行状態にある場合、次のルールに従って伝播されます。
- JSF ビューをレンダリングするリクエストに関連付けられた長時間実行される会話コンテキストは、そのレンダリングされたページから発信されたすべての faces リクエスト(JSF フォーム送信)に自動的に伝播されます。
- JSF リダイレクト (ナビゲーションルールまたは JSF
NavigationHandler
に起因するリダイレクト) になるリクエストに関連付けられた長時間実行される会話コンテキストは、結果として生じる非フェースリクエストと、同じ URL への他の後続のリクエストに自動的に伝播されます。これは、会話の一意の識別子を含むcid
という名前のリクエストパラメーターを使用して実現されます。
会話がサーブレットリクエストに伝搬されない場合、または
conversationPropagation
という名前のリクエストパラメーターに値none
がある場合、リクエストは新しい一時的な会話に関連付けられます。長時間実行されるすべての会話は、特定の HTTP サーブレットセッションに限定され、セッションの境界を越えることはできません。次の場合、伝播された長時間実行される会話を復元して、リクエストに再度関連付けることはできません。- HTTP サーブレットセッションが無効化されると、サーブレットの
service()
メソッドが完了した後、現在のセッション中に作成されたすべての長時間実行会話コンテキストが破棄されます。 - コンテナーは、リソースを節約するために、現在のサーブレットリクエストに関連付けられていない長時間実行中の会話を任意に破棄することが許可されています。
会話のサポートを提供するために、CDI Lite の実装は必要ありません。
- 作成者:
- Gavin King, Pete Muir, Antoine Sabot-Durand
- 関連事項:
Conversation
,NonexistentConversationException
,BusyConversationException