Jakarta ee 是否可以使用CDI在没有生产者方法的情况下注入自定义JBoss模块?

Jakarta ee 是否可以使用CDI在没有生产者方法的情况下注入自定义JBoss模块?,jakarta-ee,jboss,module,cdi,Jakarta Ee,Jboss,Module,Cdi,我有一个定制的JBoss7模块,它提供服务(例如,EmailService,用于发送电子邮件)。我希望在与部署在同一平台上的应用程序中使用这些服务 我在module.xml中指定了服务的JAR(位于modules/jboss/module/main) 当我省略producer方法时,我得到org.jboss.weld.exceptions.DeploymentException说weld-001408在注入点[[field]@injectbean.bean.EmailService]“}处带有限

我有一个定制的JBoss7模块,它提供服务(例如,
EmailService
,用于发送电子邮件)。我希望在与部署在同一平台上的应用程序中使用这些服务

我在
module.xml
中指定了服务的JAR(位于
modules/jboss/module/main

当我省略producer方法时,我得到
org.jboss.weld.exceptions.DeploymentException
weld-001408在注入点[[field]@injectbean.bean.EmailService]“}处带有限定符[@Default]的[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注入服务并省略生产者方法

谢谢,


丹尼斯总结了我在评论中写的内容:

  • 制作人可能是一种方式。
    • 您正在寻求注入您首先需要加载的服务。CDI具有静态特性,只能注入启动时可用的bean。解决方法是使用生产者
    • 为了区分不同的实现,可以使用限定符。例如,每个生产者和注入点都有一个给定的限定符(
      @DefaultImpl
      @ProUser
      等)
    • 您可以将这些生产者放在API JAR中,这样就不会污染您的代码(再加上添加空的
      beans.xml
  • 至于除了生产者之外的其他方式
    • 我在这里只能想到
      扩展
      ,因为它们是作为CDI引导执行的,因此允许您将实现注册为bean
    • 这将使bean在CDI引导上可用,因此无需生产者即可注入
    • 然而,事实证明,这种方法要复杂得多

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

  • 制作人可能是一种方式。
    • 您正在寻求注入您首先需要加载的服务。CDI具有静态特性,只能注入启动时可用的bean。解决方法是使用生产者
    • 为了区分不同的实现,可以使用限定符。例如,每个生产者和注入点都有一个给定的限定符(
      @DefaultImpl
      @ProUser
      等)
    • 您可以将这些生产者放在API JAR中,这样就不会污染您的代码(再加上添加空的
      beans.xml
  • 至于除了生产者之外的其他方式
    • 我在这里只能想到
      扩展
      ,因为它们是作为CDI引导执行的,因此允许您将实现注册为bean
    • 这将使bean在CDI引导上可用,因此无需生产者即可注入
    • 然而,事实证明,这种方法要复杂得多

该异常是CDI尝试“解析”注入点的结果,它找不到任何要注入到字段中的bean。您是否尝试验证生产者是否返回了除
null
以外的任何内容?例如,它实际上可以找到您的实现?否则,您的设置从CDI的角度来看是有效的。感谢您的cOmnent。它与producer方法一起正常工作;该方法找到了我的实现。但当我删除它时,会引发异常。感谢澄清。ATM我想不出其他方法来轻松完成此操作。但您不想使用
@producers
有什么原因吗?并不是我无论如何都不想要它。我只想在没有生产者的情况下,它会变得更复杂。因此我尝试删除它,但失败了。假设我使用生产者很好,那么在实现之间选择最佳实践是什么(假设有很多实现)?谢谢您的时间。这将是在您的生产者和注入点中易于使用的限定符,例如
@products@Basic
,然后对于另一个impl,您将拥有
@ProUser@ProUser
等。注入点将如下所示:
@injection@ProUser EmailService
。顺便说一句,您甚至可以移动pro将ducers添加到API jar中(加上添加空的
beans.xml
)它可能在你的应用程序代码之外为你做工作。异常是CDI试图“解析”注入点的结果,它找不到任何要注入到字段中的bean。你是否尝试验证你的生产者是否返回了除
null
以外的任何内容?例如,它实际上可以找到你的实现?否则,你的setup从CDI的角度来看是有效的。感谢您的评论。它与producer方法一起正常工作;该方法找到了我的实现。但是当我删除它时,会引发异常。感谢您的澄清。ATM我想不出其他方法来轻松做到这一点。但是您不想使用
@producers
有什么原因吗?事实并非如此不管怎样,我都不想要它。我只是更希望它没有生产者。所以我尝试删除它,但失败了。假设我使用生产者很好,那么在实现之间选择最佳实践是什么(假设有很多实现)?谢谢您的时间。这将是在您的生产者和注入点中易于使用的限定符,例如
@products@Basic
,然后对于另一个impl,您将拥有
@ProUser@ProUser
等。注入点将如下所示:
@injection@ProUser EmailService
。顺便说一句,您甚至可以移动pro导入API jar(加上添加空的
beans.xml
),它可能在应用程序代码之外为您完成工作。
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;
    }
}
<jboss-deployment-structure>
  <deployment>
    <dependencies>
      <module name="jboss.module" services="export" />
    </dependencies>
  </deployment>
</jboss-deployment-structure>