2016-07-15 57 views
1

我有一个提供服务的定制JBoss 7模块(例如,用于发送电子邮件的EmailService)。我想在部署在同一AS上的应用程序中使用这些服务。是否可以使用CDI注入不使用生产者方法的自定义JBoss模块?

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

<?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

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

目前,我使用生产者方法从 应用程序获取服务的实例。

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注入服务并省略生产者方法?

谢谢

丹尼斯

+0

唯一的例外是CDI试图“解析”注入点的结果,并不能找到任何bean来注入到该领域。 您是否试图验证您的生产者返回的是否为'null'?例如。它实际上可以找到你的实现? 否则从CDI的角度看,您的设置看起来有效。 – Siliarus

+0

感谢您的评论。它适用于生产者方法;该方法找到我的实现。但是当我删除它时,抛出异常。 –

+0

感谢您的澄清。自动取款机我想不出另一种方式轻松做到这一点。但是,你有没有理由不使用'@ Produces'? – Siliarus

回答

0

总结我在评论中写道:

  • 生产者可能是很长的路要走这里。
    • 您正在寻求注入一个您首先需要加载的服务。 CDI具有静态性质,只能注入在启动时可用的bean。解决方法是使用生产者。
    • 要区分不同的实现,您可以使用限定符。例如。每个生产者和注射点将有一个给定的限定符(@DefaultImpl,@ProUser等)。
    • 可能能够把这些生产商在你的API JAR,以免污染你的代码(加上加空beans.xml)。
  • 至于其他方面除了生产
    • 因为它们是作为CDI靴子因此让你如豆类注册的实现执行我只能想到这里Extension
    • 这将使CDI启动时可用的豆类,因此无需生产者注射。
    • 但是,这种方法将证明要复杂得多。
相关问题