2013-09-28 35 views
2

我有全局数据的@ApplicationScoped像这样的列表一个bean:不一致之处@ManagedProperty

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

    //getter and setterss goes here.. 

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

也对我有@ViewScoped豆,通过这样的@ManagedProperty引用全球国际:

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

有趣的进来SomePageController当我要增加一个项目到全球国际的这样的名单:

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

因为每次调用某个UIAction时,GlobalData都会指向一个全新的实例,并显示一个空的数据!我可以证实这一点,因为我增加了一些像这样的洛信息:

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

,然后我得到了以下的输出:

[email protected] 
[email protected] 
[email protected] 
...... 

在每次请求一个新的实例,我用Google搜索,但我的唯一信息得到的是this guy类似的问题,还是我也尝试他没有运气的解决方案=(

** aditional的信息**: IM与TomEE 1.5.2网络配置文件至极发展包括Apache的MyFaces的 还我检查了所有的anotations来自javax.faces.bean包

回答

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没有一个有效的注释definied,则默认为@NoneScoped这是在这种特殊情况下确实是在每个EL-分辨率的品牌新的实例,如@ManagedProperty

+0

添加了一个+1,因为它是一个相当常见的错误,但我只是检查了所有的anontations,它们都来自javax.faces.bean包,老实说我希望这是原因... = S – Harima555