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

Java 我可以为EJB使用CDI构造函数注入吗?,java,ejb,cdi,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(); } } 我用Gla

我想这样做:

@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进行了尝试,结果好坏参半。在某些情况下它起作用,在其他情况下它不起作用。 看看你是否对细节感兴趣

第4.9.2节Bean类说明:

该类必须具有不接受任何参数的公共构造函数

这听起来像是EJB不允许构造函数注入

但是在第3节的开头,声明会话bean由CDI支持。第3.2节详细讨论了CDI和EJB,但从未提及构造函数注入不起作用的任何内容。这让我觉得这应该被允许


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

只有在jar启用CDI时,JavaEE6中才需要EJB的构造函数注入。如果这在appserver中不起作用,请提交一个bug

请在此提交一个问题——修复EJB语言规范(这是错误的)

这是在CDITCK中测试的--但不适用于无接口视图,因此请在中提出问题,我们可以为您的案例添加测试

并最终说服了我: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();
    }
}

你想干什么?为什么不是正常的注入呢?您是否尝试过添加任何参数构造函数作为well@Kris对使用额外的无参数构造函数,它可以工作。我觉得这很奇怪。@Santosch 1)构造函数注入可以用于非EJB类,所以我对它是否也适用于EJB感兴趣。2) 打开一个问题“为什么构造函数注入优于setter或方法注入?”我将给出更多的原因;-)这就是重点,规范要求您不提供args构造函数,因此如果您想添加其他构造bean的方法,您必须记住满足容器需求。这正是我想要的答案:-)接下来的问题:为什么ExplicitConstructorSessionBean中没有arg构造函数?如果我在我的无接口视图EJB中添加一个无参数构造函数,那么构造函数注入就可以工作了。即使使用@Inject构造函数,也需要无参数构造函数吗?无参数构造函数是EJB规范的要求。这两个规范没有尽可能紧密地对齐。好吧,那么我只是缺少了无参数构造函数,这不是一个bug。谢谢将此作为答案发布。@Pete很高兴在stackoverflow上看到您:)小技巧可能是让no-arg构造函数抛出一个IllegalStateException,因为它不打算实际使用。我认为如果您有@Inject构造函数,TomEE允许省略no-arg构造函数。如果没有,它将很快:)对我来说,那将是“很快”;-)如果不需要一个无参数构造函数,这会不会破坏当前的EJB规范?是的,我还考虑过在构造函数中抛出一个异常。事实证明,构造函数确实被调用了,抛出异常会阻止实例化EJB。我认为JBoss AS也会允许您省略无参数构造函数。如果没有,它应该有,那么告诉我,我会把它修好。@Pete Muir JBoss 7.0.2还需要一个无参数构造函数,至少对于无接口视图是这样。您可以在没有参数构造函数的情况下尝试我的示例。