我有一些@SessionScoped
cdibean。以前,它们都是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会话的销毁/无效无关。
与JSF托管bean不同,CDIBean通过一些CDI管理器实现(如Weld)存储到服务器内存中。因此,它们在会话映射中不可用-映射
这怎么能模拟CDI豆呢?
更新:
焊接留档:
请记住,一旦bean绑定到上下文,它就会一直保持在该上下文中,直到上下文被销毁。无法从上下文中手动删除bean。如果您不希望bean无限期地坐在会话中,请考虑使用具有短寿命的另一个范围,例如请求或会话范围。
所以我假设,在不破坏其他东西的情况下手动破坏bean是很困难的。
为了澄清Harald的答案:
@Inject
BeanManager beanManager;
.....
AlterableContext ctxSession = (AlterableContext) beanManager.getContext(SessionScoped.class);
for (Bean<?> bean : beanManager.getBeans(YourSessionBeanToBeDestroyedClass.class)) {
Object instance = ctxSession.get(bean);
if (instance != null)
ctxSession.destroy(bean);
}
CDI1.1引入了一个带有destroy(Bean)的
AlterableContext
接口
通过beanManager获取会话上下文。getContext(SessionScoped.class)
,向下转换到AlterableContext
,然后使用适当的bean类型调用destroy()
。
我有一个会话范围的CDI托管bean: 在某个流之后,我需要从会话中删除这个bean,对于该流,我使用了以下代码,如下面的答案所示: 但是,它不起作用,仍然留在会话中。 我是否遗漏了什么?
我在解决如何正确处理JSF中会话的自动销毁方面遇到了困难。当然,此时,容器会使会话失效,从而也会在会话范围的bean上调用@PreDestroy方法。 在某些会话范围bean的预销毁中,我们正在注销一些侦听器,如下所示: 然而,getWS()方法实际上试图获取对另一个会话范围bean的引用,但失败了,如返回null。Ryan Lubke认为,后者似乎是正常的JSF行为: 我们遵守这里的规范。我不确
短篇故事:我有一个CDIbean(注释来自而不是来自),称为。我想在创建HTTP会话时实际做一些事情。 因此,我很自然地假设会起作用:当构造这个bean的实例时,只调用一次。但是,根据这里的文档,他们说调用PostConstruct方法: 当托管bean被注入到组件中时,CDI会在所有注入发生后以及在调用所有初始值设定项后调用该方法。 我假设构造后方法将在每个会话中调用一次。然而,实践与文件一致。
我的购物车有两个功能,第一个是退货总价和商品总数量: 这两个函数返回这两个参数: 和: 我可以通过此功能销毁所有购物车会话: 如何删除特定购物车项目?我在使用这个方法,它的工作。但它不会改变总价和总数量:
问题内容: 我正在使用Django和Redis作为会话引擎(也是Celery,但这是其他东西)。它运行完美,我可以看到速度有所提高。 我有一个脚本,每分钟运行一次,以通过某些方法检查活动用户,如果该用户在最近一分钟内未处于活动状态,则该会话将被删除。这样做是为了满足客户的跟踪需求。 在我切换到Redis作为会话引擎之前,该脚本运行良好。实际上,该会话确实已从数据库中删除,但未从Redis中删除。我
我有一个CDI bean,定义如下: 现在,我想以编程方式将其从会话范围中删除: 但是变量始终为空。如何检索实例并销毁它?