2011-02-16 70 views
3

我有一個應用程序範圍的託管bean,主要目的是用較少的動態數據爲應用程序的其餘部分提供服務,比如所有可用的語言和其他一些東西。應用程序範圍受管理的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方法似乎要麼開始返回空集合,要麼返回具有合適的對象的集合,但不能用於發佈selectOneMenus。重新部署使其再次工作,這也使得難以嘗試,因爲打開調試模式將通過重新部署再次工作。

什麼時間的事件可能會導致這種情況?這不是一個會話時間,我已經測試過將它設置爲一分鐘,讓會話死掉而不會導致這個問題,它大多發生在開發服務器整晚運行不受干擾的早上。所有的EJB都是無狀態的,我無法想象它們是這個問題。它可能是序列化問題嗎?

我很抱歉如此分散,也許我想了解應用程序作用域bean是如何工作的。任何幫助,將不勝感激。

+0

我想問你,什麼是語言加入?應用程序應該始終在服務器上運行,因此,如果我們添加任何內容,數據將不會被更改..? – 2015-09-12 23:56:28

回答

0

剛剛發現我的問題是:執行不正確的equals方法。 equals方法會比較對象的ID(Long),並使用==代替Long.equals。當對象的存活時間比JPA緩存長時(這是因爲在緩存失效並創建新對象之前,它們的物理地址是相同的),這導致相等總是負的。

相關問題