删除/销毁会话范围的CDI托管bean

时间:2013-09-19 14:40:59

标签: jsf-2 cdi managed-bean destroy session-scope

我有一个会话范围的CDI托管bean:

@Named
@SessionScoped 
public class SampleBean implements Serializable {
    // ...
}

我需要在某个流程之后从会话中删除此bean,我使用了以下代码,如this answer中所示:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");

但是,它不起作用且SampleBean仍在会话中 我错过了什么吗?

2 个答案:

答案 0 :(得分:8)

与JSF托管bean相反,CDI托管bean不会通过其托管bean名称直接存储在会话映射中。相反,它们由CDI管理器实现(Weld,OpenWebBeans等)使用例如存储在服务器的存储器中。会话ID为密钥。

因此,您在那里使用的技巧不适用于CDI托管bean。您需要寻找替代方法。在这种特殊情况下,正确的方法是使用@ConversationScoped而不是@SessionScoped。在设计合理的Web应用程序中,永远不需要手动终止作用域。因此,首先使用@SessionScoped进行对话/流动已经错了。

答案 1 :(得分:-1)

这个¿?

FacesContext的  .getCurrentInstance()  .getApplication()  .createValueBinding(“#{yourBeanName}”)。setValue(FacesContext.getCurrentInstance(),null);