我使用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)
答案 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()。