CDI bean 没有注入但是可以查到
CDI bean is not injected but can be looked up
所以,我写了一个扩展来注册我试图创建的 bean。该 bean 被 CDI 扫描,我可以使用:
MyInterface myInterface = CDI.current().select(MyInterface.class).get();
然后我可以访问 myInterface.myMethod();
但是,当我尝试使用以下方法注入我的 bean 时:
@Inject
@MyBean
MyInterface myInterface;
它未注入并且为空。
我要实现的是我指定接口,它定义了一些方法,然后我的代码生成这个接口的实例和returns接口类型的代理:
// defined interface
@RegisterAsMyBean
interface MyInterface {
void myMethod();
}
// usage in code:
@Inject
@MyBean
MyInterface myInterface;
我这样声明我的 bean:
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 我引用了 MyExtension
问题出在 bean 创建生命周期中 - 我试图在 processAnnotatedType 周期中创建 bean,而我本应该在 afterBeanDiscovery 周期中创建它。
将我的 bean 创建逻辑移动到适当的循环后,bean 被创建并正确注入。
所以,我写了一个扩展来注册我试图创建的 bean。该 bean 被 CDI 扫描,我可以使用:
MyInterface myInterface = CDI.current().select(MyInterface.class).get();
然后我可以访问 myInterface.myMethod();
但是,当我尝试使用以下方法注入我的 bean 时:
@Inject
@MyBean
MyInterface myInterface;
它未注入并且为空。
我要实现的是我指定接口,它定义了一些方法,然后我的代码生成这个接口的实例和returns接口类型的代理:
// defined interface
@RegisterAsMyBean
interface MyInterface {
void myMethod();
}
// usage in code:
@Inject
@MyBean
MyInterface myInterface;
我这样声明我的 bean:
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 我引用了 MyExtension
问题出在 bean 创建生命周期中 - 我试图在 processAnnotatedType 周期中创建 bean,而我本应该在 afterBeanDiscovery 周期中创建它。
将我的 bean 创建逻辑移动到适当的循环后,bean 被创建并正确注入。