2012-02-07 134 views
13

我想要做這樣的事情:我可以爲EJB使用CDI構造函數注入嗎?

@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混合結果試了一下。在某些情況下它有效,但在其他情況下則不會。 如果您對細節感興趣,請參閱this thread in the Glassfisch forum

EJB 3.1 spec,部分4.9.2 bean類說:

類必須有一個公共的構造函數沒有參數。

聽起來像EJB的構造函數注入是不允許的。

CDI spec在第3節的開頭說Session Bean是CDI支持的。然後第3.2節詳細討論了關於CDI和EJB的問題,但從來沒有提到任何有關構造器注入的問題。這讓我覺得應該允許。

那麼,規範是否允許CDI構造函數注入EJB或不?

+0

乳清你想這樣做嗎?爲什麼不正常注射? – Santosh 2012-02-07 09:48:28

+1

您是否嘗試過添加無參數構造函數 – Kris 2012-02-07 09:49:44

+0

@Kris是的。使用額外的無參數構造函數可以工作。我覺得很奇怪。 – 2012-02-07 09:52:47

回答

16

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(); 
    } 
} 
+1

小提示:可能是有沒有參數的構造函數拋出IllegalStateException,因爲它不打算實際使用。如果你有@Inject構造函數,我認爲TomEE允許忽略無參數構造函數。如果它不,它會馬上:) – 2012-02-08 20:54:50

+0

對於將「很快」;-)的TomEE它不會破壞當前的EJB規範,不需要一個無參數構造函數嗎? – 2012-02-09 06:42:00

+7

是的,我也想過在構造函數中拋出一個異常。原來構造函數被調用並拋出異常阻止實例化EJB。 – 2012-02-09 06:49:41

8

僅在Java EE 6中需要構造器注入EJB才能在CD上啓用jar。如果這不適用於應用程序服務器,請提交錯誤。

請在這裏提交一個問題 - 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測試 - 但不是無界面視圖,所以請在https://issues.jboss.org/browse/CDITCK提出問題,我們可以爲您的案件添加一個測試。

+0

非常感謝。這正是我尋找的答案:-)後續問題:爲什麼ExplicitConstructorSessionBean中的無參數構造函數?如果我向無界面視圖EJB添加無參數構造函數,則構造函數注入將起作用。即使使用@Inject構造函數,也不需要某個無參構造函數? – 2012-02-07 19:37:37

+1

無參數構造函數是EJB規範的一個要求。這兩個規範並沒有像它們那樣緊密結合。 – 2012-02-07 23:30:16

+1

好吧,那麼我只是想念沒有參數的構造函數,它不是一個錯誤。謝謝。發佈這個答案。 – 2012-02-08 11:23:19

相關問題