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

2022-09-03 00:47:53

我想做这样的事情:

@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节的开头说,CDI支持会话Bean。然后,第 3.2 节详细讨论了 CDI 和 EJB,但从未提及构造函数注入不起作用的任何内容。这让我认为应该允许这样做。

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


答案 1

KrisPete Muir 最终说服了我:EJB 必须有一个公共的 no-arg 构造函数,即使另一个构造函数用于注入。同时使用两个构造函数很奇怪,但它有效。谢谢你们。

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

答案 2

只有在为 jar 启用了 CDI 的情况下,Java EE 6 才需要构造函数注入 EJB。如果这在应用程序服务器中不起作用,请提交错误。

也请在这里提交一个问题 - 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 中提出问题,我们可以为您的情况添加测试。


推荐