代码之家  ›  专栏  ›  技术社区  ›  ikos23

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

  •  1
  • ikos23  · 技术社区  · 6 年前

    我的应用程序正在部署到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 ...
    }
    

    失败,错误如下:

    [错误]CWWKZ002E:启动时发生异常 应用我的应用程序。异常消息为: com.ibm.ws.container.service.state.stateChangeException(状态更改例外): com.ibm.ws.cdi.cdie例外: com.ibm.wsspi.injectionengine.injectionexception: com.ibm.ejs.container.ejb配置异常:ejb类 com.demo.app.userservice必须具有 不带参数的公共构造函数

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

    另一方面,我在焊接文件中发现了这一点:

    首先,容器调用bean构造函数(默认 构造函数或带注释的@inject),以获取 豆子。

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

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

    有什么想法吗?:)

    3 回复  |  直到 6 年前
        1
  •  3
  •   Siliarus    6 年前

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

    CDI规范对构造函数有一些限制——要么没有参数,要么有一个 @Inject . 但也有 this chapter ,它指定在EE中,规则集根据EJB会话bean的要求进行扩展。

    现在我们进入EJB规范,它需要一个bean上的无参数构造函数。 这应该在第章 Enterprise Bean Class 它所在的州

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

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

        2
  •  3
  •   Mehran Mastcheshmi    6 年前

    EJB会话bean的创建是由EJB容器完成的,但是它可以选择使用CDI提供EE资源注入,但是EJB解析被委托给容器。

    https://docs.jboss.org/weld/reference/2.1.0.Final/en-US/html/ri-spi.html 说:

    或者,集成商可以选择使用CDI提供EE 资源注入。在这种情况下,EE注入环境应该是 使用,并且集成器应该实现A.1.4节,__EJB 服务__,A.1.7节,__资源服务_和A.1.5节,__JPA 服务业。 …
    焊接寄存器资源注入点 EJB注入服务、JPAInjectionServices、ResourceInjectionServices 以及jaxwsinjectionServices实现(在引导程序中)。 这允许在以下位置执行资源注入点的验证: 启动时间而不是运行时

    如果您对CDI和EJB是如何集成感兴趣的话。您可以看看weld ejb模块和weld集成的代码(glassfish代码)

        3
  •  2
  •   Frito    6 年前

    EJB注册为CDIBeans。但首先,它们必须满足EJB规范的要求。

    我想它只是通过提供no-args构造函数来工作。