mardi 22 mai 2018

CDI bean is not injected but can be looked up

So, I wrote an extension which registers bean I am trying to create. The bean gets scanned by CDI and I can get it using:

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

And I can then access myInterface.myMethod();

However, when I try to inject my bean using:

@Inject
@MyBean
MyInterface myInterface;

it is not injected and is null.

What I want to achieve is that I specify interface, which defines some methods,then my code generates instance of this interface and returns proxy of interface type:

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

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

I declared my bean like this:

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
}

Also in META-INF/services/javax.enterprise.inject.spi.Extension I put reference to MyExtension





Aucun commentaire:

Enregistrer un commentaire