是否可以使用CDI注入不使用生产者方法的自定义JBoss模块?

时间:2016-07-15 14:30:56

标签: java-ee jboss module cdi

我有一个自定义JBoss 7模块,它提供服务(例如,EmailService用于发送电子邮件)。我想在部署在同一AS上的应用程序中使用这些服务。

我在module.xml(位于modules/jboss/module/main)中指定了该服务的jar。

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="jboss.module">
  <resources>
    <resource-root path="email-service-api.jar" />
    <resource-root path="email-service-impl.jar" />
  </resources>
</module>

email-service-api.jar仅包含服务的接口。我将此作为接口实现(在email-service-impl.jar中)和使用该服务的应用程序的依赖项。

email-service-impl.jar中有一个名为jboss.module.EmailService的文件(位于META-INF/services文件夹中)。该文件包含我所有实现的完全限定名称(到目前为止我只有一个):

jboss.module.impl.DefaultEmailService

我想将服务注入应用程序。

目前,我使用producer方法从中获取服务的实例 应用。

package bean;

public class Bean {

    @Inject
    EmailService emailService;

    @Produces
    public EmailService getEmailService() {
        ServiceLoader<EmailService> emailServices = ServiceLoader.load(EmailService.class);

        for (EmailService emailService : emailServices) {
            if (emailService != null) {
                return emailService;
            }
        }

        return null;
    }
}

当我省略制作人方法时,我得org.jboss.weld.exceptions.DeploymentExceptionWELD-001408 Unsatisfied dependencies for type [EmailService] with qualifiers [@Default] at injection point [[field] @Inject bean.Bean.emailService]"}}

我在应用程序中有jboss-deployment-structure.xml个文件:

<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="jboss.module" services="export" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>

我尝试将beans.xml文件添加到“实施项目”(即email-service-impl.jar)中,但它没有效果。无论如何都发生了例外。

是否可以使用CDI注入服务并省略生产者方法?

谢谢,

丹尼斯

1 个答案:

答案 0 :(得分:0)

总结我在评论中所写的内容:

  • 生产者可能是去这里的一种方式。
    • 您正在寻求注入首先需要加载的服务。 CDI具有静态特性,只能注入启动时可用的bean。解决它的方法是使用生产者。
    • 要区分不同的实现,可以使用限定符。例如。每个生产者和注入点都有一个给定的限定符(@DefaultImpl@ProUser等)。
    • 可能能够将这些生成器放入您的API JAR中,以免污染您的代码(另外添加空beans.xml)。
  • 除了生产者以外的其他方式
    • 我只能在这里考虑Extension,因为它们是作为CDI启动执行的,因此允许您将实现注册为bean。
    • 这会使bean在CDI启动时可用,因此可以在没有生产者的情况下注入。
    • 然而,这种方法会更加复杂。