2012-02-07 103 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

相关问题