0

私はfaces-configを置き換えたMyFacesJSF2.0を使用しています

<managed-bean>
    <managed-bean-name>myBean</managed-bean-name>
    <managed-bean-class>com.myBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
    with
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class MyBean  implements Serializable {

発生したエラーは以下のとおりです。これは、faces-configの変更を復元すると機能します。私が間違っていることは何ですか?

0000008e FaceletViewDe E   Error Rendering View[/test.xhtml]
                             javax.faces.FacesException: Property facesContext     references object in a scope with shorter lifetime than the target scope session
at     org.apache.myfaces.config.ManagedBeanBuilder.initializeProperties(ManagedBeanBuilder.java:324)
at     org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:169)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:303)
at org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:266)
4

2 に答える 2

1

このエラーは、

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

    @ManagedProperty("#{facesContext}")
    private FacesContext facesContext;

}

これは不可能であり、これも実際には悪い設計です。はFacesContext現在のリクエストに固有であり、HTTP リクエストごとに変更されます。ただし、セッション スコープ Bean は HTTP セッション中に 1 回だけ作成され、注入されたFacesContextインスタンスは、セッション スコープ Bean の作成中に関与した HTTP 要求の 1 つだけを参照します。FacesContext同じセッション内の後続のリクエストでは、前のリクエストのインスタンスが無効になるため、大きな問題が発生するだけです。

プロパティ (および から取得したその他のプロパティ)を削除する必要があります。代わりに、必要な場所とまったく同じメソッド ブロックでそれらを取得する必要があります。FacesContextExternalContext

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

    public void someMethod() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        // ...
    }

}
于 2012-06-18T19:35:26.403 に答える
0

セッション Bean は facesContext よりも長く「存続」するため、セッション スコープで @ManagedProperty を使用して facesContext を注入することはできません。リクエスト スコープ Bean を作成し、facesContext とセッション Bean を注入してそこでジョブを実行するか、セッション Bean 内で FacesContext.getCurrentInstance() を呼び出す必要があります。

于 2012-06-18T16:22:30.067 に答える