我有一些@SessionScoped
CDI bean。以前所有这些都是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");
在订单处理完成后,所有内容都设置为默认值。这与破坏/无效整个HTTP会话无关,在整个HTTP会话中,订单处理成功终止后用户不得注销。
与JSF托管bean不同,CDI bean通过某些CDI管理器实现(如Weld)存储在服务器的内存中。因此,它们在会话地图中不可用 - Map<String, Object>
。
如何对CDI bean进行模拟?
更新:
请记住,一旦bean绑定到上下文,它就会保留 在上下文被破坏之前的上下文。 没有办法 从上下文中手动删除bean。如果你不想要bean 无限期地坐在会话中,考虑使用另一个范围 缩短了生命周期,例如请求或会话范围。
所以我假设,在不破坏其他东西的情况下手动销毁bean很难。
答案 0 :(得分:3)
CDI 1.1引入了AlterableContext
接口和destroy(Bean<T>)
方法。
通过beanManager.getContext(SessionScoped.class)
获取会话上下文,向下转换为AlterableContext
,然后使用适当的bean类型调用destroy()
。