我有一些@SessionScopedCDI 豆。以前它们都是 JSF 托管 Bean(从 JSF 托管 Bean 更改为 CDI 托管 Bean)。
我正在执行以下操作,以删除用户成功下达在线订单后管理的一些会话范围的 JSF。
Map<String, Object> sessionMap = context.getSessionMap();
sessionMap.remove("cartBean");
sessionMap.remove("orderItems");
sessionMap.remove("reviewOrderBean");
sessionMap.remove("intermediateLocaleBean");
sessionMap.remove("localeBean");
sessionMap.remove("currencyRateBean");
sessionMap.remove("currency");
Run Code Online (Sandbox Code Playgroud)
以便订单处理完成后一切都设置为默认值。这与销毁/无效整个 HTTP 会话无关,在订单处理成功终止后,用户不得注销。
与 JSF 托管 bean 不同,CDI bean 通过某些 CDI 管理器实现(例如 Weld)存储到服务器内存中。因此,它们在会话映射中不可用 - Map<String, Object>。
对于 CDI bean,如何模拟这一点?
更新 :
焊接文档:
请记住,一旦 bean 绑定到上下文,它就会保留在该上下文中,直到该上下文被销毁。无法从上下文中手动删除 bean。如果您不希望 bean 无限期地驻留在会话中,请考虑使用另一个生命周期较短的作用域,例如请求或会话作用域。
所以我认为,很难在不破坏其他东西的情况下手动破坏一个 bean。
CDI 1.1 引入了AlterableContext带有destroy(Bean<T>)方法的接口。
通过 获取会话上下文beanManager.getContext(SessionScoped.class),向下转换为AlterableContext,然后destroy()使用适当的 bean 类型进行调用。