@NormalScope(passivating=true) @InheritedSE @DocumentedSE @TargetSE(valueSE={TYPESE,FIELDSE,METHODSE}) @RetentionSE(valueSE=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()
も呼び出すことができます。
Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.