アノテーション型 ViewScoped
@NormalScope(passivating=true) @InheritedSE @DocumentedSE @TargetSE({TYPESE,FIELDSE,METHODSE}) @RetentionSE(RUNTIMESE) public @interface ViewScoped
このアノテーションがクラスで
jakarta.inject.Namedとともに見つかった場合、ランタイムは、NavigationHandler.handleNavigation(jakarta.faces.context.FacesContext, java.lang.String, java.lang.String)が現在のビューの viewId とは異なる viewId を持つビューへのナビゲーションを引き起こさない限り、Bean がアクティブなままになるように、Bean を CDI スコープに配置する必要があります。CDI および Jakarta EE プラットフォームで必要なすべての挿入と通知は、予想される時間に通常どおりに発生する必要があります。ProjectStageがProjectStage.Productionでない場合は、現在のUIViewRootのtransientプロパティがtrueに設定されていないことを確認してください。その場合、現在のviewIdのFacesMessageをFacesContextに追加して、ビューが一時的としてマークされていると@ViewScopedBean が機能しないことを示します。また、Level.WARNINGメッセージをログに記録します。ProjectStageがProjectStage.Productionの場合、この検証を行わないでください。Bean は、
UIViewRoot.getViewMap(boolean)から返されたマップに格納する必要があります。このアノテーションを使用するには、CDI 仕様で定義されているように、ビュースコープに格納されている Bean がシリアライズ可能かつプロキシ可能である必要があります。
ランタイムは、スコープの開始時と終了時にそれぞれ
PostConstructまたはPreDestroyでアノテーションが付けられた Bean のメソッドが呼び出されるようにする必要があります。2 つの状況により、スコープが終了する可能性があります。FacesContext.setViewRoot(jakarta.faces.component.UIViewRoot)が呼び出され、新しいUIViewRootは現在のものとは異なります。Bean の作成時にたまたまアクティブだったセッションが期限切れになります。Bean の作成時にセッションが存在していなかった場合、この状況は当てはまりません。
セッションの有効期限の場合、ランタイムは、
@PreDestroyアノテーション付きメソッドの処理中に呼び出された場合、FacesContext.getCurrentInstance()が有効なインスタンスを返すことを確認する必要があります。この状況で呼び出すのに有効なFacesContextのメソッドのセットは、「アプリケーションの起動時またはシャットダウン時にこのメソッドを呼び出すのに有効」として記載されているものと同じです。そのFacesContextから返されたExternalContextでは、「アプリケーションの起動時またはシャットダウン時にこのメソッドを呼び出すのに有効」と記載されているすべてのメソッドを呼び出すことができます。さらに、メソッドExternalContext.getSessionMap()も呼び出すことができます。- 導入:
- 2.2