与@ManagedProperty不一致

时间:2013-09-28 00:06:47

标签: jsf-2 myfaces managed-property tomee

我在@ApplicationScoped中有一个包含全局数据列表的bean,如下所示:

@ApplicationScoped
@ManagedBean
public class GlobalData
{
  private List data = new ArrayList();

  //getter and setterss goes here.. 

  public void addSomeData(Object item) { data.add(item); }
}

我还有一个@ViewScoped bean,它通过@ManagedProperty引用GlobalData,如下所示:

@ManagedBean
@ViewScoped
public class SomePageController
{
   @ManagedProperty(value="#{globalData}"
   private GlobalData theGlobalData;
   //also public getter and setter of theGlobalData
}

有趣的是,在SomePageController中,我希望将项目添加到GlobalData列表中,如下所示:

public void someUIAction()
{
    SomeItem item = bussinesProcess();
    theGlobalData.addSomeData( item );
}

因为每次调用someUIAction时,全局数据都指向一个带有空数据的全新实例!我可以确认这一点,因为我添加了一些这样的登录信息:

public void someUIAction()
{
    SomeItem item = bussinesProcess();
    theGlobalData.addSomeData( item );
    System.out.println(theGlobalData.toString());
}

然后我得到以下输出:

com.myproyect.beans.GlobalData@3c76da81
com.myproyect.beans.GlobalData@19c1818a
com.myproyect.beans.GlobalData@9a7jp79c
......

每个请求都有一个新实例,我用谷歌搜索但是我能得到的唯一信息是this guy有类似的问题,我仍然尝试过没有运气的解决方案=(。

** aditional info **:  我正在使用TomEE 1.5.2 web profile进行开发,其中包括Apache MyFaces  我还检查了所有的anotations都来自javax.faces.bean包

1 个答案:

答案 0 :(得分:1)

如果您从错误的软件包导入了@ApplicationScoped注释,例如CDI的javax.enterprise.context,这将是大多数IDE建议的第一个自动完成选项。当您使用JSF的@ManagedBean管理bean时,您需要确保您还使用来自相同Bean管理API的托管bean作用域。

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

当JSF托管bean没有定义有效的注释时,它默认为@NoneScoped,在这种特殊情况下,确实是每个EL分辨率上的全新实例,例如@ManagedProperty