[英]Can I use CDI constructor injection for EJBs?
我想做這樣的事情:
@Stateless
public class GreeterEjb {
private final Greeter greeter;
@Inject
public GreeterEjb(Greeter greeter) {
this.greeter = greeter;
}
public String greet() {
return greeter.greet();
}
}
我用Glassfish 3.1.1和JBoss 7.0.2嘗試了混合結果。 在某些情況下,它可以工作,在其他情況下則不然。 如果您對詳細信息感興趣,請參閱Glassfisch論壇中的此主題 。
EJB 3.1規范 ,4.9.2節Bean類說:
該類必須具有不帶參數的公共構造函數。
這聽起來像EJB不允許構造函數注入。
但CDI規范在第3節開頭說,會話Bean受CDI支持。 然后,第3.2節詳細討論了CDI和EJB,但從未提及有關構造函數注入不起作用的任何內容。 這讓我覺得它應該被允許。
那么,這些規范是否允許為EJB提供CDI構造函數注入?
Kris和Pete Muir最終說服了我:即使使用另一個構造函數進行注入,EJB也必須有一個公共的無參數構造函數。 很奇怪,同時使用兩個構造函數,但它的工作原理。 多謝你們。
在Glassfish 3.1.1,JBoss 7.0.2和TomEE 1.0.0-beta-2上成功測試。
@Stateless
public class GreeterEjb {
private final Greeter greeter;
@Inject
public GreeterEjb(Greeter greeter) {
this.greeter = greeter;
}
// public no-arg constructor required for EJBs
// injection still works fine with the @Inject constructor
public GreeterEjb() {
this.greeter = null;
}
public String greet() {
return greeter.greet();
}
}
僅當為jar啟用CDI時,Java EE 6中才需要構造函數注入EJB。 如果這不適用於appserver,請提交bug。
還請在此處提交一個問題 - http://java.net/jira/browse/EJB_SPEC - 修復EJB語言規范(這是錯誤的)。
這是在CDITCK中測試的 - https://github.com/jboss/cdi-tck/blob/master/impl/src/main/java/org/jboss/cdi/tck/tests/implementation/enterprise/definition/ExplicitConstructorSessionBean .java - 但不適用於no-interface-views,所以請在https://issues.jboss.org/browse/CDITCK中提出一個問題,我們可以為你的案例添加一個測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.