通过生产者创建bean之后触发CDI事件

时间:2018-08-29 09:22:44

标签: events cdi

我有一个CDI生产者方法,该方法创建一个UserBean。生产者触发UserBeanEvent。其他Bean依赖于该用户Bean,这些Bean可以在观察者方法中使用。

CDI再次尝试创建用户bean,调用生产者,触发事件,等等-无限循环。

在生产者完成并将bean完全添加到bean存储之后,是否有任何巧妙的方法来触发事件?我仔细查看了资料来源,但找不到任何东西。

我在WildFly 10.1上使用WELD 2.3.5.final

1 个答案:

答案 0 :(得分:0)

您需要详细说明几件事,最重要的一件事是范围,什么时候需要bean?

很显然,如果有一个侦听器方法侦听此bean事件,并且还需要在observer参数中引用此bean,则您肯定是在创建一个循环依赖项,您无法解决,因为CDI中的事件是默认情况下是同步的(即使您使用fireAsync,也无法保证事件到达时CDI会将bean置于适当的上下文中)

我可以通过对早期加载的bean(例如带有某种早期加载项的ejbs Singleton@ApplicationScoped)进行方法注入来解决此问题,然后从那里触发事件。

假设已预先加载了bean:

public class EargerBean {

    @Inject
    private Event<BeanEvent> event;

    @Inject
    public void onInjected(Bean bean){
        BeanEvent beanEvent ...;
        event.fire(beanEvent);
    }

}