从会话中删除bean

时间:2014-10-22 18:23:43

标签: jsf cdi jsf-2.2

我有一些@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进行模拟?


更新:

The Weld documentation

  

请记住,一旦bean绑定到上下文,它就会保留   在上下文被破坏之前的上下文。 没有办法   从上下文中手动删除bean。如果你不想要bean   无限期地坐在会话中,考虑使用另一个范围   缩短了生命周期,例如请求或会话范围。

所以我假设,在不破坏其他东西的情况下手动销毁bean很难。

1 个答案:

答案 0 :(得分:3)

CDI 1.1引入了AlterableContext接口和destroy(Bean<T>)方法。

通过beanManager.getContext(SessionScoped.class)获取会话上下文,向下转换为AlterableContext,然后使用适当的bean类型调用destroy()