2016-07-15 56 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啓動時可用的豆類,因此無需生產者注射。
    • 但是,這種方法將證明要複雜得多。
相關問題