gpt4 book ai didi

jsf-2 - 应用程序范围内的托管 bean 正在消亡?

转载 作者:行者123 更新时间:2023-12-04 23:58:44 24 4
gpt4 key购买 nike

我有一个应用程序范围的托管 bean,其主要目的是为应用程序的其余部分提供较少的动态数据,例如所有可用语言和其他一些东西。

应用程序 Controller

@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 的对象的集合。重新部署使其再次工作,这也使得它很难进行试验,因为打开 Debug模式将使其通过重新部署再次工作。

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

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

最佳答案

刚刚发现我的问题所在:未正确实现的 equals 方法。 equals 方法会比较对象的 ids (Long),并使用 == 而不是 Long.equals。这导致当对象的生命周期长于 JPA 缓存时,相等性始终为负(因为它们的物理地址将相同,直到缓存失效并创建新对象)。

关于jsf-2 - 应用程序范围内的托管 bean 正在消亡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5014046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com