【问题标题】:Inconsistency with @ManagedProperty与@ManagedProperty 不一致
【发布时间】:2013-10-04 09:43:07
【问题描述】:

我在 @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 时,GlobalData 都会指向一个全新的实例,其中包含一个空数据!!!!我可以确认这一点,因为我添加了一些这样的登录信息:

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 有类似的问题,但我也尝试了他的解决方案,但没有运气 =(。

** 附加信息**: 我正在使用 TomEE 1.5.2 Web 配置文件进行开发,其中包括 Apache MyFaces 我还检查了所有注释都来自 javax.faces.bean 包

【问题讨论】:

    标签: jsf-2 myfaces managed-property apache-tomee


    【解决方案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

    【讨论】:

    • 添加了一个 +1,因为它是一个相当常见的错误,但我只是检查了所有注释,它们都来自 javax.faces.bean 包,老实说,我希望这是原因...... =S
    猜你喜欢
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2017-09-14
    • 2013-04-02
    • 2014-07-21
    • 2019-01-29
    相关资源
    最近更新 更多