不应在SessionScoped bean中捕获从MDB触发的CDI事件

时间:2015-04-13 09:27:12

标签: jsf events timer ejb cdi

我遇到了从EJB计时器触发的CDI事件的问题。

重点是,可以通过手动用户操作触发save事件(例如,从CDI SessionScoped bean方法触发)。在这种情况下,所有注册的观察员都应该抓住它。但是如果从Timer触发的CDI事件被SessionScoped bean捕获(无论如何不需要),则会抛出异常,找不到活动的Context。

那么......我怎么能告诉CDI事件机制只有ApplicationScoped bean应该捕获事件,以防它被EJB Timer触发?

1 个答案:

答案 0 :(得分:3)

我找到了解决方案。

@Observes包含参数" notifyObserver"。如果将其设置为Reception.IF_EXISTS,则CDI不会在HTTP请求之外创建SessionScoped bean(如果没有)。

因此,EJB Timer触发事件不会被SessionScoped bean捕获(因为它不存在),并且由于存在SessionScoped bean的现有实例,因此将捕获手动触发的事件。