通过构造函数进行依赖注入不适用于 EJB bean

joh*_*ohn 5 java dependency-injection ejb weld jakarta-ee

我的应用程序正在部署到 IBM WebSphere 上。我有一个简单的服务,我想知道在这种情况下依赖注入是如何工作的。

// stateless EJB
@Stateless
public class UserService {

    private UserDAO userDAO;

    // btw, UserDAO is stateless EJB as well
    @Inject
    public UserService(UserDAO userDAO) {
        this.userDAO = userDAO;    
    }

    // biz methods ...
}
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下错误:

[错误] CWWKZ0002E:启动应用程序 my-app 时发生异常。异常消息为: com.ibm.ws.container.service.state.StateChangeException: com.ibm.ws.cdi.CDIException: com.ibm.wsspi.injectionengine.InjectionException: com.ibm.ejs.container.EJBConfigurationException: EJB com.demo.app.UserService 类必须有一个不带参数的公共构造函数

我记得 EJB 规范中有这样一句话:bean 实例首先由容器实例化,然后完成依赖注入,the class must have a public constructor that takes no parameters这对我来说是有意义的。

另一方面,我在 WELD 文档中发现了这一点:

首先,容器调用 bean 构造函数(默认构造函数或带 @Inject 注释的构造函数)来获取 bean 的实例。

我有点困惑,为什么我的EJB无法实例化。

当我们有构造函数注入点时,如何创建 EJB 实例并注入依赖项?

有任何想法吗?:)

Sil*_*rus 4

因此,您不满足初始化 EJB bean 的要求。

CDI 规范对构造函数有一些限制 - 要么无参数,要么带有@Inject. 但还有这一章,它指定在 EE 中,规则集是根据 EJB 会话 bean 的要求进行扩展的。

现在我们正在讨论 EJB 规范,它需要在 bean 上使用无参数构造函数。这应该在Enterprise Bean Class它指出的章节中

该类必须定义一个不带参数的公共构造函数。

现在,最后讨论这是否可行- 例如,您可以拥有一个使用 CDI 构造函数注入的 EJB bean 吗?好吧,让我们看一下 CDI TCK,这是所有实现和容器都必须通过的一组测试,才能声明它们实现了 CDI。在那里,我们可以看到这个 bean使用它的测试- 所以是的,这可以工作,但是您需要有两个构造函数。