我可以为EJB使用CDI构造函数注入吗?

时间:2012-02-07 09:12:11

标签: java 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节开头说,会话Bean受CDI支持。然后,第3.2节详细讨论了CDI和EJB,但从未提及有关构造函数注入不起作用的任何内容。这让我觉得应该允许它。

那么,规范是否允许为EJB提供CDI构造函数注入?

2 个答案:

答案 0 :(得分:19)

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 :(得分:9)

只有在为jar启用CDI时,Java EE 6中才需要构造函数注入EJB。如果这不适用于appserver,请提交错误。

请在此处提出问题 - 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中提出问题,我们可以为您的案例添加测试。