0

我正在使用 MyFaces JSF 2.0,其中我替换了 faces-config

<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;

}

这是不可能的,这实际上也是糟糕的设计。特定于当前请求和每个 HTTP 请求的FacesContext更改。但是会话范围的 bean 在 HTTP 会话期间只创建一次,并且注入的FacesContext实例只会引用在创建会话范围的 bean 期间涉及的 HTTP 请求之一。在同一会话中的任何后续请求中,这只会导致重大问题,因为FacesContext先前请求的实例将不再有效。

您需要删除FacesContext属性(以及您从中获得的任何其他属性ExternalContext)。相反,您应该在与您需要的地方完全相同的方法块中检索它们。

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

}
于 2012-06-18T19:35:26.403 回答
0

您不能在会话范围内使用 @ManagedProperty 注入 facesContext,因为会话 bean“寿命”比 facesContext 长。您必须创建一个请求范围 bean 并注入 facesContext 和您的会话 bean 并在那里完成工作,或者在会话 bean 中调用 FacesContext.getCurrentInstance()。

于 2012-06-18T16:22:30.067 回答