我有一个提供服务的定制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