Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过构造函数的依赖项注入不适用于EJB bean_Java_Jakarta Ee_Dependency Injection_Ejb_Weld - Fatal编程技术网

Java 通过构造函数的依赖项注入不适用于EJB bean

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) {

我的应用程序正在部署到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 ...
}
它失败,出现以下错误:

[错误]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。 在那里,我们可以看到-是的,这可以工作,但你需要有两个构造函数