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在会话中仍然存在.
我错过了什么吗?
与JSF托管bean相反,CDI托管bean不是由其托管bean名称直接存储在会话映射中.它们由CDI管理器实现(Weld,OpenWebBeans等)存储在服务器的内存中,例如使用会话ID作为密钥.
因此,您在那里使用的技巧不适用于CDI托管bean.您需要寻找替代方法.在这种特殊情况下,正确的方法是使用@ConversationScoped而不是@SessionScoped.在设计合理的Web应用程序中,永远不需要手动终止作用域.因此,首先使用@SessionScoped对话/流程已经是错误的.
| 归档时间: |
|
| 查看次数: |
4050 次 |
| 最近记录: |