如何检查存储有@WindowScoped的对象是否正确存储?

时间:2012-01-20 09:15:17

标签: jsf-2 myfaces codi

两天前我写了这个问题: How can I retrieve an object on @WindowScoped? 并且BalusC回答了一些建议,现在我有一些问题要理解我的问题是WindowScoped中的对象是正确存储还是我的代码检索它是错误的!

嗯,正如我所说的,我有一个存储在@WindowScoped注释中的对象,但我只能在第一次才能回溯这个对象!为什么呢?

我有一个疑问:MyFaces的CODI扩展可以以某种方式配置吗?或者我可以使用它简单地将jar文件添加到我的项目中?

但是,这些是我的代码的一部分,因为我不知道问题出在哪里:

LogicBean.java(我应该检索的对象):

@ManagedBean (name="logicBean" )
@WindowScoped
public class LogicBean implements Serializable 
{
    String pageIncluded;
    // getter and setter methods

    public String action(String value)
    {
        setPageIncluded(value);

        return "include";
    }
}

include.xhtml:

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

ProgettiController.java

@ManagedBean(name = "progettiController")
@SessionScoped
public class ProgettiController implements Serializable {

    private FacesContext context = FacesContext.getCurrentInstance();
    private LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
    //getter and setter methods

    public void testMethod()
    {
        logicBean.action("WEB-INF/jsf/page1.xhtml");
    }
}

我还尝试使用@ManagedProperty(“#{logicBean}”)并将范围设置为WindowScoped但没有任何变化......


编辑:经过一些新的试验,我发现了一个奇怪的问题,在我的include.xhtml上我添加了#{progettiController.logicBean.getPageIncluded()}和#{logicBean.getPageIncluded()}来检查这两个字段o?

好吧,当我第一次加载应用程序时,变量设置正确,我看到了我想要的东西,第二次用新值设置第一个变量,但第二个是空的,我什么都没看到,但现在是奇怪的事情...如果我应该再次尝试应用程序,我应该打开index.xhtml,我有这样的形式:

<h:form>
    <h:commandLink action="#{logicBean.action('/WEB-INF/jsf/progetti/List.xhtml')}" value="Show All Progetti Items"/>
</h:form>

结果是什么? 第一个变量保持设置为旧值(错误),但第二个变量设置正确,所以我可以像我一样查看页面! 如果有人可以帮助我,我将永远感谢他/她!

1 个答案:

答案 0 :(得分:1)

CODI是CDI的扩展,因此您应该通过CDI @Named注释而不是JSF @ManagedBean注释来管理您的bean。然后你可以通过CDI @Inject注释注入另一个bean。以下示例应该有效:

import javax.inject.Named;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowScoped;

@Named
@WindowScoped
public class LogicBean implements Serializable {
    // ...
}

import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@SessionScoped
public class ProgettiController implements Serializable {

    @Inject
    private LogicBean logicBean;

    // ...
}