Object 如何获取特定cdi会话范围bean的所有实例
我有一个@SessionScoped CDIBean,用于跟踪web应用程序中的用户会话信息。有没有办法从另一个@ApplicationScoped bean中找到这个bean的所有对象?你不能开箱即用。出于安全考虑,JavaEE禁止这种事情 现在,您可以想象一种更精细的方法来在应用程序范围级别跟踪这些会话bean。最干净的方法是从Object 如何获取特定cdi会话范围bean的所有实例,object,find,cdi,session-bean,Object,Find,Cdi,Session Bean,我有一个@SessionScoped CDIBean,用于跟踪web应用程序中的用户会话信息。有没有办法从另一个@ApplicationScoped bean中找到这个bean的所有对象?你不能开箱即用。出于安全考虑,JavaEE禁止这种事情 现在,您可以想象一种更精细的方法来在应用程序范围级别跟踪这些会话bean。最干净的方法是从@ApplicationScopedbean生成它们: @ApplicationScoped public class Registry { private Li
@ApplicationScoped
bean生成它们:
@ApplicationScoped
public class Registry {
private List<SessionData> data = new ArrayList<>;
@Produces
@SessionScoped
public SessionData produceSessionData() {
SessionData ret = new SessionData();
data.add(ret);
return ret;
}
public void cleanSessionData(@Disposes SessionData toClean) {
data.remove(toClean);
}
}
@ApplicationScoped
公共类注册表{
私有列表数据=新的ArrayList;
@产生
@会议范围
公共SessionData produceSessionData(){
SessionData ret=新SessionData();
数据。添加(ret);
返回ret;
}
public void cleansiondata(@Disposes SessionData to clean){
数据删除(toClean);
}
}
请注意
@Dispose
方法,该方法将在生成的bean结束其生命周期时调用。这是一种使列表保持最新并避免额外内存使用的方便方法。感谢Antoine提供了宝贵的答案。我必须在ApplicationScoped bean中的HashMap的帮助下完成这项工作,当成功登录时,该HashMap将加载唯一的用户ID和相关的SessionScoped bean对象,然后从SessionScoped bean的PreDestroy事件中的HashMap中删除相关的session bean对象。我也必须试试你的解决办法。再次感谢。