[英]CDI Injection into existing object instance - worked with CDI 1.0 but not with CDI 1.1
由於我必須使用的框架的限制,我需要注入現有的對象實例(無法通過CDI本身照常創建它們)。 我的注入點用@EJB
或@Inject
標記。
在JBoss EAP 6.4,Java EE 6和CDI 1.0中,使用以下代碼可以很好地工作:
public class DispatcherUtils {
public static <T> void inject(T anObject) {
BeanManager beanManager = getBeanManager();
Class<T> objClass = (Class<T>) anObject.getClass();
AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(objClass);
InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
CreationalContext<T> context = new IgnorantCreationalContext<>();
injectionTarget.inject(anObject, context);
injectionTarget.postConstruct(anObject);
}
private static BeanManager getBeanManager() {
try {
return (BeanManager) InitialContext.doLookup("java:comp/BeanManager");
} catch (final NamingException e) {
e.printStackTrace();
}
return null;
}
}
如果我嘗試在JBoss EAP 7.0,Java EE 7和CDI 1.1中執行相同的操作,則僅將標有@Inject
的注入點注入到目標對象中,而標有@EJB
的注入點不會注入(它們的值保持為null)。
我不明白為什么會這樣。
是否可以通過JBoss EAP 7.0,Java EE 7和CDI 1.1注入現有對象,並填充@EJB
注入點?
更新,2016-06-19,20:11
我剛剛發現,只要要注入的對象具有無參數構造函數,上述模式就可以工作。
示例-這可以工作 :
public class ExampleBean {
private Dispatcher dispatcher;
@Inject
private SomeCdiBean someCdiBean;
@EJB
private SomeEjbService someEjbService;
public ExampleBean() {
}
public ExampleBean(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
}
雖然這不起作用 :
public class ExampleBean {
private Dispatcher dispatcher;
@Inject
private SomeCdiBean someCdiBean;
@EJB
private SomeEjbService someEjbService;
public ExampleBean(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
}
在這種情況下,為什么CDI會檢查默認構造函數的存在? (注意:bean 不是由CDI創建的,因此構造函數不應有任何區別)
可能的問題可能是, 沒有 no-args構造函數的ExampleBean
不被視為托管bean 。 集成商(Wildfly,EAP,glassfish等)只能向managed beans
提供EE資源注入( @EJB
是EE資源注入)。
引用Weld文檔 :
集成商可能希望使用InjectionServices提供Weld提供的其他字段或方法注入。 與Java EE環境的集成可以使用InjectionServices為托管bean提供EE資源注入。
為了使ExampleBean
成為managed bean
並且不使用no-args構造函數,您需要聲明一個@Inject
注釋的構造函數。
盡管我在這里只是一個瘋狂的猜測,但不能真正確定為什么您說它可以與EAP 6和CDI 1.0一起使用。
僅作記錄用途-據我所知,EAP 7包含CDI 1.2 (而不是1.1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.