パッケージ jakarta.faces.view

アノテーション型 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