我使用的是MyFaces JSF2.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)发布于 2012-06-19 03:35:26
这个错误表明你有一个
@ManagedBean
@SessionScoped
public class MyBean implements Serializable {
@ManagedProperty("#{facesContext}")
private FacesContext facesContext;
}这是不可能的,这实际上也是一个糟糕的设计。FacesContext是特定于当前请求的,并且在每次HTTP请求时都会发生变化。但是会话作用域bean在HTTP session期间只创建一次,注入的FacesContext实例将只引用创建会话作用域bean时涉及的HTTP请求之一。在同一会话中的任何后续请求中,这只会导致一个重大问题,因为前一个请求的FacesContext实例将不再有效。
您需要删除FacesContext属性(以及从ExternalContext获得的任何其他属性)。相反,您应该在与所需位置完全相同的方法块中检索它们。
@ManagedBean
@SessionScoped
public class MyBean implements Serializable {
public void someMethod() {
FacesContext facesContext = FacesContext.getCurrentInstance();
// ...
}
}发布于 2012-06-19 00:22:30
您不能在会话作用域中使用@ManagedProperty注入facesContext,因为会话bean的“生存期”比facesContext长。您必须创建一个请求范围bean,注入facesContext和您的会话bean并在那里完成工作,或者在会话bean中调用FacesContext.getCurrentInstance()。
https://stackoverflow.com/questions/11086821
复制相似问题