アノテーション型 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
に追加して、ビューが一時的としてマークされていると@ViewScoped
Bean が機能しないことを示します。また、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