java - 通过构造函数的依赖注入(inject)不适用于 EJB bean

标签 java jakarta-ee dependency-injection ejb weld

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

// 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 ...
}

它失败并出现以下错误:

[ERROR ] CWWKZ0002E: An exception occurred while starting the application my-app. The exception message was: com.ibm.ws.container.service.state.StateChangeException: com.ibm.ws.cdi.CDIException: com.ibm.wsspi.injectionengine.InjectionException: com.ibm.ejs.container.EJBConfigurationException: EJB class com.demo.app.UserService must have a public constructor that takes no parameters



我记得 EJB 规范中有一段话:the class must have a public constructor that takes no parameters对我来说, 是有意义的。 bean 实例首先由容器实例化,然后进行依赖注入(inject) .

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

First, the container calls the bean constructor (the default constructor or the one annotated @Inject), to obtain an instance of the bean.



我有点困惑,为什么我的 EJB 不能被实例化。

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

有任何想法吗? :)

最佳答案

所以发生的情况是您不满足初始化 EJB bean 的要求。

CDI 规范对构造函数有一些限制 - 无参数或带有 @Inject 的构造函数.
但也有this chapter ,它指定在 EE 中,规则集根据 EJB session bean 的要求进行扩展。

现在我们进入 EJB 规范,它需要一个 bean 上的无参数构造函数。
这应该在章节Enterprise Bean Class 中它在哪里声明

The class must define a public constructor that takes no arguments.



现在,最后继续讨论这是否应该工作 - 例如你能有一个使用 CDI 构造函数注入(inject)的 EJB bean 吗?
好吧,让我们看一下 CDI TCK,这是一组测试,所有实现和容器都必须通过才能声称它们实现了 CDI。
在那里,我们可以看到 this beanthis test using it - 所以是的,这可以工作,但你需要有两个构造函数。

关于java - 通过构造函数的依赖注入(inject)不适用于 EJB bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376733/

相关文章:

java - 使用不同的数据类型

java - Spring 3验证错误

java - 在 ubuntu 中使用 eclipse 创建 tomcat - maven 项目

java - JNDI 作为服务定位器设计模式是否不好?

java - 从jar中读取xml文件

c# - 为什么注入(inject)到我的 Azure Function v2 中的 ILogger 缺少 APPINSIGHTS_INSTRUMENTATIONKEY?

.net - 使用依赖注入(inject)框架的优秀开源项目?

java - 更改 .java 文件后出错(由 : java. lang.NullPointerException 引起)

java - 返回字符串中的时间

c# - 适合 Unity 的抽象工厂