Java 通过构造函数的依赖项注入不适用于EJB bean
我的应用程序正在部署到IBM WebSphere上。我有一个简单的服务,我想知道在这种情况下依赖注入是如何工作的Java 通过构造函数的依赖项注入不适用于EJB bean,java,jakarta-ee,dependency-injection,ejb,weld,Java,Jakarta Ee,Dependency Injection,Ejb,Weld,我的应用程序正在部署到IBM WebSphere上。我有一个简单的服务,我想知道在这种情况下依赖注入是如何工作的 // stateless EJB @Stateless public class UserService { private UserDAO userDAO; // btw, UserDAO is stateless EJB as well @Inject public UserService(UserDAO userDAO) {
// 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 ...
}
它失败,出现以下错误:
[错误]CWWKZ0002E:启动时发生异常
我的应用程序。异常消息是:
com.ibm.ws.container.service.state.StateChangeException:
com.ibm.ws.cdi.CDIException:
com.ibm.wsspi.injectionengine.InjectionException:
com.ibm.ejs.container.ejbConfiguration异常:EJB类
com.demo.app.UserService必须具有
不带参数的公共构造函数
我记得EJB规范中有这样一句话:类必须有一个不带参数的公共构造函数
,对我来说,bean实例首先由容器实例化,然后进行依赖项注入
另一方面,我在焊接文档中发现:
首先,容器调用bean构造函数(默认值)
构造函数或带注释的@Inject),以获取
豆子
我有点困惑,为什么我的EJB不能被实例化
当我们有构造函数注入点时,如何创建EJB实例和注入依赖项
有什么想法吗?:) EJB注册为CDIBean。但首先,它们必须满足EJB规范的要求
我猜它只是通过提供无参数构造函数来工作。EJB会话bean的创建由EJB容器完成,但它可以选择使用CDI来提供EE资源注入,但EJB解析被委托给容器 说: 或者,集成商可以选择使用CDI来提供EE 资源注入。在这种情况下,EE_注入环境应该是 集成器应该实现第A.1.4节“EJB 服务”,第A.1.7节“资源服务”和第A.1.5节“JPA 服务”。 ..
Weld使用注册表注册资源注入点 EjbInjectionServices、JpaInjectionServices、ResourceInjectionServices 以及JaxwsInjectionServices的预先实现(在引导阶段)。 这允许在以下位置执行资源注入点的验证: 启动时间而不是运行时
如果您对如何集成CDI和EJB感兴趣。您可以查看一下weld EJB模块和weld集成的代码(glassfish代码)因此,您不符合初始化EJB bean的要求。 CDI规范对构造函数有一些限制-要么没有参数,要么带有
@Inject
。
但也有,它指定在EE中,规则集根据EJB会话bean所需进行扩展
现在我们进入EJB规范,它要求bean上有一个无参数构造函数。
这应该在enterprisebeanclass
一章中说明
该类必须定义不带参数的公共构造函数
现在,最后讨论这是否应该起作用——例如,您可以使用CDI构造函数注入来创建EJB bean吗?
好的,让我们看一看CDI TCK,这是一组测试,所有实现和容器都必须通过这些测试才能声明它们实现了CDI。
在那里,我们可以看到-是的,这可以工作,但你需要有两个构造函数