我有一個提供服務的定製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.DeploymentException
說WELD-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注入服務並省略生產者方法?
謝謝
丹尼斯
唯一的例外是CDI試圖「解析」注入點的結果,並不能找到任何bean來注入到該領域。 您是否試圖驗證您的生產者返回的是否爲'null'?例如。它實際上可以找到你的實現? 否則從CDI的角度看,您的設置看起來有效。 – Siliarus
感謝您的評論。它適用於生產者方法;該方法找到我的實現。但是當我刪除它時,拋出異常。 –
感謝您的澄清。自動取款機我想不出另一種方式輕鬆做到這一點。但是,你有沒有理由不使用'@ Produces'? – Siliarus