так что не работает как есть :(

оложим, у меня есть класс с инъекциями:

class MyBean {

    @Inject
    Helper helper;

    // all sorts of data
}

и этот класс был создан таким образом, что контейнер CDI не знает об этом, как отражение, сериализация илиnew, В этом случаеhelper являетсяnull потому что CDI не инициализировал его для нас.

Есть ли способ сказать CDI «активировать» бин или, по крайней мере, его инъекцию? например, как если бы он был создан сInstance<MyBean>#get?

Прямо сейчас у меня есть взлом, где я делаю следующее:

class SomeClass {

    @Inject
    Instance<MyBean> beanCreator;

    void activateBean() {
        MyBean mybean = ... // reflection/serialization/new
        MyBean realBean = beanCreator.get();
        Helper proxy = realBean.getHelper();
        mybean.setHelper(proxy);
        beanCreator.destroy(realBean);
    }
}

Это выглядит довольно плохо, но это работает для всего, что я тестировал. Это просто показывает, какой конечный результат я хочу получить.

Использование Wildfly 10.1, если это важно.

Ответы на вопрос(1)

MyBean не способ CDI; на самом деле вы оперируете так называемым неконтекстным объектом. Что вы делаете, это берете не управляемый CDI объект и просите CDI разрешить точки внедрения. Это довольно необычно, поскольку вы обрабатываете часть жизненного цикла (создание / уничтожение), в то время как CDI делает все остальное.

В вашем случаеMyBean класс должен статьInjectionTargetи именно так вы должны начать искать. Для запуска инъекции вы захотите сделать что-то вроде этого (во время созданияMyBean):

// Create an injection target from your given class
InjectionTarget<MyBean> it = beanManager.getInjectionTargetFactory(beanManager.createAnnotatedType(MyBean.class))
                .createInjectionTarget(null);
CreationalContext<MyBean> ctx = beanManager.createCreationalContext(null);
MyBean instance = new MyBean();
it.postConstruct(instance); // invoke @PostContruct
it.inject(instance, ctx); // trigger actual injection on the instance

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

 Siliarus05 сент. 2017 г., 07:05
@ Марк Да, я думаю, что вы можете использовать десериализацию. Смысл этой строки в моем примере - получить ссылку на фактический экземпляр. Так и должно работать.
 Mark06 сент. 2017 г., 03:46
Я проверил это, и инъекция бобаnull так что не работает как есть :(
 Mark04 сент. 2017 г., 17:23
Благодарю. Контекст:MyBean является частью объекта состояния, который мне нужно сохранить и загрузить, в настоящее время с сериализацией (см. мой предыдущийвопрос). Я читал, что использование инъекций в сущностях не очень хорошая идея, но эта сущность нуждается в этом. Кроме того, где вы пишетеnew MyBean() это может быть заменено десериализацией или отражением, верно?
 aschoerk04 сент. 2017 г., 19:02
Возможно, вам следует подумать, если это разумно и необходимо возложить на MyBean ответственность, которую он выполняет, используя Helper. Иногда структура лучше, если вы позволитеDecorator, Adaptor или дажеIterator справиться с этим. Обычно это бины, которые могут иметь обычную область видимости, создаваемую контейнером и способную работать с вашими объектами данных.
 maress04 сент. 2017 г., 23:17
Если вы предоставите вариант использования того, как сущность на самом деле зависит от таких bean-компонентов, то мы можем помочь реорганизовать ее в гораздо лучшую конструкцию, которая не потребует внедрения в сущность. В идеале вы должны рассматривать объект как данные и иметь отдельный компонент для обработки этих данных.

Ваш ответ на вопрос