【问题标题】:Fire CDI event AFTER bean creation via producer通过生产者创建 bean 后触发 CDI 事件
【发布时间】:2019-02-04 00:51:16
【问题描述】:

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

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

在生产者完成并且 bean 完全添加到 bean 存储之后,有没有什么巧妙的方法来触发事件?我查看了来源,但找不到任何东西。

我在 WildFly 10.1 上使用 WELD 2.3.5.final

【问题讨论】:

  • 您正在创建一个循环依赖,这通常是一种错误的模式。尝试再次考虑您的代码,可能还有其他方法可以解决这个问题,但很难说问题提供的信息很少。你能给我们一个更大的画面,说明为什么你需要在那个时候触发事件吗? bean 的创建是基于给定范围/上下文的激活,所以也许你想观察一下?

标签: events cdi


【解决方案1】:

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

很明显,如果有一个观察者方法来监听这个bean事件,并且还需要在观察者参数中引用这个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);
    }

}

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 2013-01-07
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-04-08
    • 1970-01-01
    相关资源
    最近更新 更多