JSF 2 - 通过Annotation替换Managed Bean的faces-config配置

时间:2012-06-18 16:12:09

标签: jsf-2

我使用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)

2 个答案:

答案 0 :(得分:1)

此错误表示您已

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

}

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

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

@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

}

答案 1 :(得分:0)

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