首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSF 2-使用注释替换受管理Bean的faces-config配置

JSF 2-使用注释替换受管理Bean的faces-config配置
EN

Stack Overflow用户
提问于 2012-06-19 00:12:09
回答 2查看 1.7K关注 0票数 0

我使用的是MyFaces JSF2.0,其中我替换了faces-config

代码语言:javascript
复制
<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更改,它就会起作用。我做错了什么?

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-19 03:35:26

这个错误表明你有一个

代码语言:javascript
复制
@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

}

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

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

代码语言:javascript
复制
@ManagedBean
@SessionScoped
public class MyBean implements Serializable {

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

}
票数 1
EN

Stack Overflow用户

发布于 2012-06-19 00:22:30

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11086821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档