应用程序范围的托管bean死亡?

时间:2011-02-16 08:18:59

标签: jsf-2 ejb-3.0 jpa-2.0 java-ee-6 cdi

我有一个应用程序范围的托管bean,其主要目的是使用较少的动态数据(如所有可用语言和更多内容)为应用程序的其余部分提供服务。

的ApplicationController

@ManagedBean(eager=true)
@ApplicationScoped
public class ApplicationController implements Serializable {
    private static final long serialVersionUID = 25488214212L;

    private List<Language> languages;
    private Map<Language, List<LevelDescription>> descriptionsPersonal;
    private Map<Language, List<LevelDescription>> descriptionsTechnical;
    private List<Integer> levels = new ArrayList<Integer>();

    @EJB private LanguageDao languageDao;
    @EJB private LevelDescriptionDao levelDescriptionDao;
    @EJB private IntraConnectionBean intraBean;
    @EJB private ApplicationBean appBean;

    public ApplicationController() {
    }

    @PostConstruct
    public void init(){
        languages = languageDao.findAll();
        descriptionsTechnical = new HashMap<Language, List<LevelDescription>>();
        descriptionsPersonal = new HashMap<Language, List<LevelDescription>>();
        for(int i = 0; i < 6; i++)
            levels.add(i);
        for(Language l : languages){
            List<LevelDescription> desc = levelDescriptionDao.findAll(l, true);
            if(!desc.isEmpty())
                descriptionsTechnical.put(l, desc);
            desc = levelDescriptionDao.findAll(l, false);
            if(!desc.isEmpty())
                descriptionsPersonal.put(l, desc);
        }
    }

    public List<Language> getLanguages(){
        if(lang)
        return languages;
    }

    public List<LevelDescription> getTechnicalItems(Language lang) {
        return descriptionsTechnical.get(lang);
    }

    public List<LevelDescription> getPersonalItems(Language lang) {
        return descriptionsPersonal.get(lang);
    }

    public List<Integer> getLevels(){
        return levels;
    }
}

这似乎工作正常。一阵子。当单独离开应用程序一段时间,也许一个小时,我会得到极其奇怪的行为。 get-methods似乎要么开始返回空集合,要么返回带有看似正确的对象的集合,但不适用于发布selectOneMenus。重新部署使其再次运行,这也使得难以进行实验,因为打开调试模式将使其通过重新部署再次起作用。

什么时间事件可能会导致这种情况?这不是会话超时,我已经测试将它设置为一分钟并让会话死亡而不会导致此问题,它主要发生在开发服务器整夜运行不受干扰之后的早晨。所有EJB都是无状态的,我无法想象它们是问题所在。它可能是序列化问题吗?

我为如此分散而道歉,也许我不知何故误解了应用程序作用域bean的工作方式。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

刚刚发现我的问题是:错误实现的equals方法。 equals方法将比较对象的ID(Long),并使用==而不是Long.equals。当对象比JPA缓存更长时(这是因为它们的物理地址在缓存失效并创建新对象之前它们的物理地址相同),这导致相等总是为负。