簡體   English   中英

我可以為EJB使用CDI構造函數注入嗎?

[英]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構造函數注入?

KrisPete 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM