Боб CDI не вводится, но его можно посмотреть - PullRequest
0 голосов
/ 22 мая 2018

Итак, я написал расширение, которое регистрирует бин, который я пытаюсь создать.Бин сканируется CDI, и я могу получить его, используя:

MyInterface myInterface = CDI.current().select(MyInterface.class).get();

И тогда я могу получить доступ к myInterface.myMethod();

Однако, когда я пытаюсь ввести свой бин, используя:

@Inject
@MyBean
MyInterface myInterface;

он не внедрен и имеет значение null .

Чего я хочу добиться, так это указать интерфейс, который определяет некоторые методы, затем мой код генерирует экземпляр этого интерфейсаи возвращает прокси типа интерфейса:

// defined interface
@RegisterAsMyBean
interface MyInterface {
    void myMethod();
}

// usage in code:
@Inject
@MyBean
MyInterface myInterface;

Я объявил свой компонент следующим образом:

public class MyExtension implements Extension {
    public void register(@Observes @WithAnnotations(RegisterAsMyBean.class) ProcessAnnotatedType<?> aType) {
        Class<?> typeDef = aType.getAnnotatedType().getJavaClass();

        if(typeDef.isInterface()) {
            proxyTypes.add(typeDef);
            aType.veto();
        }
    }
}

public class BeanCreator implements Bean<Object> {
    @Override
    public Object create(CreationalContext<Object> creationalContext) {
        // my instance building logic
    }
    // ... other overriden methods
}

Также в META-INF / services / javax.enterprise.inject.spi.Extension Iпоставить ссылку на MyExtension

1 Ответ

0 голосов
/ 20 июня 2018

Проблема заключалась в жизненном цикле создания бина - я пытался создать бин в цикле processAnnotatedType, хотя я должен был сделать это во время цикла afterBeanDiscovery.

После перемещения логики создания бина в соответствующий цикл создается бини правильно впрыскивается.

...