Событие Fire CDI ПОСЛЕ создания компонента через производителя - PullRequest
0 голосов
/ 29 августа 2018

У меня есть метод производителя CDI, который создает UserBean. Производитель стреляет UserBeanEvent. Другие bean-компоненты полагаются на этот пользовательский bean-компонент, и эти bean-компоненты могут использоваться в методах наблюдателя.

CDI снова пытается создать пользовательский компонент, вызывается производитель, происходит событие и т. Д. - бесконечный цикл.

Есть ли какой-нибудь изящный способ вызвать событие ПОСЛЕ того, как продюсер завершил работу, и бин был полностью добавлен в хранилище бинов? Я просмотрел источники, но ничего не смог найти.

Я использую WELD 2.3.5.final на WildFly 10.1

1 Ответ

0 голосов
/ 29 августа 2018

Вам нужно детализировать несколько вещей, и одна из самых важных - это область действия, и в какой момент нужен боб?

Очевидно, что если существует метод наблюдателя, который прослушивает событие этого компонента, а также нуждается в ссылке на этот компонент в параметре наблюдателя, то вы определенно создаете циклическую зависимость, которую вы не можете разрешить, так как события в CDI синхронный по умолчанию (и даже если вы используете fireAsync, нет никакой гарантии, что к моменту прибытия события CDI поместит компонент в надлежащий контекст)

Я бы решил эту проблему, выполнив инъекцию метода в загруженный ранее компонент, такой как ejbs Singleton или @ApplicationScoped, с какой-либо загрузкой в ​​начале, а затем вызвал бы событие оттуда.

Предполагается, что бин загружен ранее:

public class EargerBean {

    @Inject
    private Event<BeanEvent> event;

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

}
...