【发布时间】:2016-12-30 22:52:52
【问题描述】:
我创建了一个 Java 项目作为其他项目的库,从而减少项目之间的代码重复。此 lib 项目导出到 jar 以包含在 Web 项目(WAR,而不是 EAR)中。
在 Web 项目中(这些类已被删除),一切都照常工作,而所有类都保留在它们上面 ─ 简单和复杂对象(具有生产者和设置的对象)的注入正常工作.
在删除 Web 项目的这些类并将具有这些相同类的 jar 添加到 Web 项目(在 Maven 项目中的 pom.xml 中设置此库)之后,一切都正常编译,就像以前一样。但是在启动服务器时,容器在 CDI 启动期间找不到现在存在于 jar 中的类(CDI bean),从而产生这个(著名的)错误:
WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)
已将 beans.xml 添加到 src/main/resources(在 WELD 和 CDI 文档中表示)的 META-INF 文件夹中作为项目的根文件夹。
以下是 jar 中的 bean(Session、SessionFactory 和 ExampleLogger)示例,它们需要注入到其他项目中(并且在该类在 Web 项目中时已经正常工作)但现在不是 被 CDI 发现:
public class HibernateConnectionFactory {
@Produces
@ApplicationScoped @ConnectionBaseExample
public SessionFactory createSessionFactoryExample() {
Configuration configuration = new Configuration();
configurarSessionFactory(configuration, "baseExampleDS");
ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
return configuration.buildSessionFactory(registry);
}
@Produces
@RequestScoped @ConnectionBaseExample
public Session createSessionExample(@ConnectionBaseExample SessionFactory sessionFactory) {
return sessionFactory.openSession();
}
public void destruirSessionExemplo(@Disposes @ConnectionBaseExample Session session) {
if (session.isOpen()) {
session.close();
}
}
}
public class ExampleLoggerProducer {
@Produces
public ExampleLogger createLogger(InjectionPoint injectionPoint) {
return new ExampleLogger(injectionPoint.getMember().getDeclaringClass());
}
}
问题出现在 Maven 项目和非 Maven 项目中。有没有人遇到过这个问题?有谁知道容器可以找到 jar 中的 bean 的解决方案吗?提前感谢您,对英语不好表示抱歉。
Java EE7、CDI 1.1、WELD 2.1、服务器 WildFly 8.1
【问题讨论】:
-
这应该工作,所以你的设置有问题。你确定这个罐子包括在战争中吗?您是否更改了注释(限定符)的包名称?您是否在 jar 项目中创建了一个新的简单 bean 并尝试将其注入到战争中。这行得通吗?
-
是的,我试过了。不久前再次尝试,我找到了解决方案 ─ 我将 beans.xml 放在项目 root 文件夹 内的 META-INF 文件夹中,并且成功了!这与 WELD 文档中关于如何在 jar 中使用 CDI bean 的描述背道而驰,其中说放置 beans.xml 的位置在 src/main/resources/META-INF 中,但没关系。无论如何,谢谢 Guenther。
-
请查看您的
beans.xml。是否指定bean-discovery-mode="annotated",如果是,请注释生产者类,至少使用ApplicationScoped -
我尝试了“annotated”和“all”,但问题是我导出 jar 的方式,使用 Eclipse 的导出 jar 向导而不是使用 Maven 来执行此操作。谢谢@maress
标签: jakarta-ee cdi weld jboss-weld