如何在@WindowScoped上检索对象?

时间:2012-01-18 14:40:45

标签: jsf-2 myfaces codi

在这篇文章Dynamic ui:include中,我问过如何在一些状态下存储一个对象,这个状态允许我加载同一浏览器的新窗口或标签,并且它也没有存储在新窗口中。 Adrian Mitev告诉我使用@WindowScoped,一个名为CODI的MyFaces扩展选项,我试图实现它。

现在我应该说我是盲人,当我尝试打开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对象?

1 个答案:

答案 0 :(得分:2)

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

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

E.g。

@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);
// ...