我的应用程序正在部署到 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 bean和 this test using it - 所以是的,这可以工作,但你需要有两个构造函数。
关于java - 通过构造函数的依赖注入(inject)不适用于 EJB bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53376733/