我如何使会话中的特定bean无效?
我有这个示例代码。 我用ExternalContext.invalidateSession()测试;但它会破坏应用程序中会话中的所有bean,因为它会破坏整个会话。
@Named
@SessionScoped
class Managed implements Serializable {
public void invalidate (){
// lines //
externalContext.invalidateSession();
}
}
但是,使用invalidateSession会话中的所有bean都被销毁,我想只使一个特定的" Managed"豆,我是怎么做到的?
答案 0 :(得分:1)
忽略您不清楚 如何实施此解决方案的事实,开始
将BeanManager
注入您计划执行逻辑的位置。 是一个托管组件
@Inject
BeanManager beanManager;
bean管理器是允许您访问上下文中所有CDI bean(以及其他内容)的组件。
然后使用BeanManager
获取您感兴趣的bean的上下文引用
Bean<Managed> bean = (Bean<Managed>) beanManager.resolve(beanManager.getBeans(Managed.class));
Managed managedBean= (Managed) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean)
managedBean = null; //or whatever you want to do with it
此解决方案应该销毁该会话bean的活动实例;如果再次尝试使用同一个bean,CDI很可能会按需创建一个全新的实例
答案 1 :(得分:-1)
虽然使用BeanManager
的方法是可行的,但我建议采用略有不同的方法。
您应该@Inject HttpSession
进入托管@SessionScoped
bean,然后在该会话中调用invalidate()
。
这些方面的东西:
@Named
@SessionScoped
class Managed implements Serializable {
@Inject
HttpSession session;
public void invalidate (){
session.invalidate(); //invalidates current session
}
}
实现这一目标的另一种方法是使用FacesContext
。你走在正确的轨道上,但你需要采取一个额外的步骤:
((HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true)).invalidate();