Проблемы с инжекцией зависимости от сварки

У меня есть POJO, который я создаю для хранения контекста для клиента RESTful API, похожего на этот (настоящий класс является проприетарным).

class MyPOJO {

    @Inject
    public AnInjectedInterface obj1;

    @Inject
    public AnotherInjectedInterface obj2;

    public String data1;

    public int data2;

    public long data3;

}

Я хочу использовать это так:

MyPOJO pojo = new MyPOJO();
pojo.data1 = "something";
pojo.data2 = 43;
pojo.data3 = 2875640;
pojo.obj1.someFunction();
pojo.obj2.anotherFunction("something");

Если я делаю это, obj1 и obj2 всегда равны нулю. Эти интерфейсы используются в других классах, отличных от POJO, и вводятся правильно. Они являются зависимыми объектами, и приведенный выше код появляется в bean-объекте приложения, поэтому я не могу внедрить туда POJO.

У меня вопрос такой; DI недоступен в объектах, которые не создаются контейнером? Если да, то есть ли способ сообщить контейнеру создать экземпляр моего зависимого POJO в компоненте, определяемом приложением, с зависимостями? Если нет, что я делаю не так? Мой контейнер - Wildfly 11.

Спасибо.

1 ответ

Решение

Ты делаешь это неправильно. Вместо того, чтобы использовать MyPOJO pojo = new MyPOJO(); ты только @Inject MyPOJO pojo в какой класс (бин) вы хотите использовать его.

CDI / Weld делает создание для вас, и в то же время он решит все внутренние зависимости (obj1 а также obj2 в твоем случае).

Я вижу, что вы отредактировали вопрос, так что вот другие биты ответов.

Прежде всего, вы можете ввести @Dependent в @ApplicationScoped и если вам нужно несколько экземпляров, вы можете использовать Instance<MyPOJO> и на каждом get() Вы должны получить новый экземпляр. Но учтите, что вам необходимо убедиться, что вы избавляетесь и от этих объектов!

DI недоступен в объектах, которые не создаются контейнером?

По умолчанию CDI не будет обрабатывать его в любом случае. Однако вы можете выполнить инъекцию в такой объект самостоятельно. Чтобы оставаться точным, объект, в который вы вводите, будет обрабатываться как InjectionTarget и вам понадобится BeanManager сделать это. Вот примерно как (не код копирования-вставки):

BeanManager beanManager; // assuming you have obtained BM somehow
CreationalContext<Object> ctx = beanManager.createCreationalContext(null);
InjectionTarget<MyPOJO> injectionTarget = beanManager
                    .getInjectionTargetFactory(beanManager.createAnnotatedType(MyPOJO.class)).createInjectionTarget(null);
injectionTarget.inject(myPojoInstance, ctx);
creationalContext = ctx; // store ctx so you can later on use it to dispose of the dependent instance!
Другие вопросы по тегам