【问题标题】:How can I retrieve an object on @WindowScoped?如何在@WindowScoped 上检索对象?
【发布时间】:2012-02-13 06:45:31
【问题描述】:

在这篇Dynamic ui:include 的帖子中,我询问了如何将对象存储在某种状态下,该状态可以允许我加载同一浏览器的新窗口或选项卡,并且它也没有存储在新窗口中。 Adrian Mitev 告诉我使用 @WindowScoped,这是 MyFaces 扩展的一个选项,称为 CODI,我尝试实现它。

现在我应该说我是盲人,当我试图打开 Apache Wiki 时,我的浏览器在许多页面上崩溃,所以我无法阅读指南。

但是我在我的项目中添加了源代码,编译器没有给出任何错误。 问题是现在当我尝试检索@WindowScoped 存储的 bean 时页面无法正常工作!

我在我的 bean 中使用此代码:

@ManagedBean (name="logicBean" )
@WindowScoped

include.xhtml 中,我使用以下代码检索参数:

<ui:include src="#{logicBean.pageIncluded}"/> 

在我的其他 bean 中,我使用此代码检索 LogicBean(我确信问题出在此代码上)

LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");

如何检索“正确”的 LogicBean 对象?

【问题讨论】:

    标签: jsf-2 myfaces codi


    【解决方案1】:

    您正在尝试从会话映射中获取LoginBean。这仅适用于具有标准 JSF @SessionScoped 注释的会话范围 bean。

    访问其他 bean 的规范方法是在检索 bean 上使用 @ManagedProperty

    例如

    @ManagedBean
    @RequestScoped
    public class OtherBean {
    
        @ManagedProperty("#{logicBean}")
        private LogicBean logicBean;
    
        // Getter+Setter.
    }
    

    如果您确实需要通过以编程方式评估 EL 在方法块内访问它,您应该改用 Application#evaluateExpressionGet()

    FacesContext context = FacesContext.getCurrentInstance();
    LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
    // ...
    

    【讨论】:

    • @BalusC:非常感谢!我知道代码在会话中检索了对象,但我不知道如何更改它!再次感谢!
    猜你喜欢
    • 2012-02-14
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2019-02-16
    • 2015-05-15
    相关资源
    最近更新 更多