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

Jin*_*uel 4 session-scope destroy cdi jsf-2 managed-bean

我有一个会话作用域CDI托管bean:

@Named
@SessionScoped 
public class SampleBean implements Serializable {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我需要在某个流程之后从会话中删除这个bean,我使用了以下代码,如下面的答案所示:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.getSessionMap().remove("sampleBean");
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 8

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

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