我有一个CDI生产者方法,该方法创建一个UserBean
。生产者触发UserBeanEvent
。其他Bean依赖于该用户Bean,这些Bean可以在观察者方法中使用。
CDI再次尝试创建用户bean,调用生产者,触发事件,等等-无限循环。
在生产者完成并将bean完全添加到bean存储之后,是否有任何巧妙的方法来触发事件?我仔细查看了资料来源,但找不到任何东西。
我在WildFly 10.1上使用WELD 2.3.5.final
答案 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);
}
}