我有一个会话范围的CDI托管bean:
@Named
@SessionScoped
public class SampleBean implements Serializable {
// ...
}
我需要在某个流程之后从会话中删除此bean,我使用了以下代码,如this answer中所示:
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");
但是,它不起作用且SampleBean
仍在会话中
我错过了什么吗?
答案 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);