当前位置: 首页 > 知识库问答 >
问题:

删除/销毁会话范围的CDI托管bean[重复]

长孙嘉容
2023-03-14

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

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

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

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

但是,它不起作用,samplebean仍然留在会话中。
我是否遗漏了什么?

共有1个答案

庄宇
2023-03-14

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

因此,您在这里使用的技巧不适用于CDI托管bean。你需要寻找一种替代的方法。在这种特殊情况下,正确的方法是使用@conversationscoped而不是@sessionscoped。在正确设计的web应用程序中,永远不应该需要手动终止作用域。因此,使用@sessionscoped作为会话/流已经是错误的。

 类似资料:
  • 我有一些cdibean。以前,它们都是JSF管理的bean(从JSF管理的bean更改为CDI管理的bean)。 我像下面这样做是为了删除用户成功下在线订单后管理的一些会话范围的JSF。 以便在订单处理完成后将所有内容设置为默认值。这与在订单处理成功终止后不能注销用户的整个HTTP会话的销毁/无效无关。 与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存

  • 在JSF1.2应用程序中,我是否可以覆盖使用子类返回的会话范围的托管Bean? 阶级结构 我有一个会话范围的托管Bean,,及其子类,: 面配置。xml 问题陈述 EL表达式返回的实例。 我想用的实例重新绑定名称,以便EL表达式为会话的其余部分返回子类的实例。 有没有办法实现我的目标? 激励范例 处理应用程序主页后面的GUI逻辑。当用户从专用登录页面进入应用程序时,我需要提供一个受限的、简化的主页

  • 我在解决如何正确处理JSF中会话的自动销毁方面遇到了困难。当然,此时,容器会使会话失效,从而也会在会话范围的bean上调用@PreDestroy方法。 在某些会话范围bean的预销毁中,我们正在注销一些侦听器,如下所示: 然而,getWS()方法实际上试图获取对另一个会话范围bean的引用,但失败了,如返回null。Ryan Lubke认为,后者似乎是正常的JSF行为: 我们遵守这里的规范。我不确

  • 我们希望通过集成SpringCDIJSFSpringSecurity来创建web应用程序。我们已经配置了上面所有的框架,我们认为一切正常,但是在实现注销功能的过程中,我们意识到JSF的ManagedBeans并不是在应该创建的时候创建的。例如:我们已经在会话作用域中创建了托管bean,我们希望在注销并使会话无效后删除该bean。 不幸的是,在重新登录之后,托管bean实例仍然是活的(每个用户的信息

  • 我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean

  • 我有一个CDI bean,定义如下: 现在,我想以编程方式将其从会话范围中删除: 但是变量始终为空。如何检索实例并销毁它?