容器找不到 .jar 中的 CDI bean(未满足的依赖项)
CDI beans inside .jar are not found by the container (Unsatisfied dependencies)
我创建了一个 Java 项目作为其他项目的库,减少了项目之间的代码重复。此 lib 项目导出到 jar 以包含在 Web 项目中(WAR,不是 EAR)。
在 Web 项目中(这些 classes 被删除)一切正常,而所有 classes 都保留在它们上面 ─ 注入简单和复杂对象(具有生产者和设置的对象)工作正常。
删除 Web 项目的这些 classes 并将具有这些相同 classes 的 jar 添加到 Web 项目(在 Maven 项目的 pom.xml 中设置此库)一切正常编译,就像以前一样。但是在启动服务器时,容器在 CDI 启动期间找不到现在存在于 jar 中的 classes(CDI bean),生成这个(著名的)错误:
WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)
已经在META-INF文件夹中添加了beans.xml作为src/main/resources(在WELD和CDI文档中指出)的根文件夹项目。
下面是 jar 中存在的 bean(Session、SessionFactory 和 ExampleLogger)示例,需要注入其他项目(并且在 class 在 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
一段时间后再次尝试我找到了解决方案 ─ 我将 beans.xml 放在 项目根目录中的 META-INF 文件夹中 文件夹,它成功了!这与 WELD 文档中关于如何在 jar 中使用 CDI bean 的描述相悖,其中说放置 beans.xml 的位置在 src/main/resources/META-INF 中,但没关系。也许在某些 Maven 项目中,确实如此。
[更新] 这是有效的,因为我是使用 Eclipse 的导出 jar 向导而不是使用 Maven 来构建 jar。使用 Maven 应该与 beans.xml in src/main/resources/META-INF.
一起正常工作
希望这也能帮助其他人解决这种情况。
我在 Eclipse 中遇到了两个项目的相同症状。 WAR 项目从导入的 JAR 库项目中注入了实现。 Maven 全部正确编译,但在本地 运行 环境中的 运行 期间,bean 管理器无法解析库 bean,不稳定并发送提到的异常。
Eclipse 不使用 Maven 准备调试代码,它的 Project Facets 使用 Maven 插件配置。 Maven 依赖项在两个项目中都匹配,但问题出在 Eclipse 项目配置中。
我的环境是 JBoss EAP 6.4,我发现 Maven 插件设置了 JAR CDI 项目方面但保留了默认版本 2.0。 运行-时间实际上支持 CDI 1.0,WAR 项目中的 CDI 项目方面具有正确的版本。
在我的例子中,WAR 和导入的 JAR 项目中的 CDI 项目方面的不同版本导致了此异常。需要手动 Eclipse 项目方面版本更正。在 运行 时间环境和 Eclipse 项目方面之间匹配的 CDI 版本问题消失了。
我创建了一个 Java 项目作为其他项目的库,减少了项目之间的代码重复。此 lib 项目导出到 jar 以包含在 Web 项目中(WAR,不是 EAR)。
在 Web 项目中(这些 classes 被删除)一切正常,而所有 classes 都保留在它们上面 ─ 注入简单和复杂对象(具有生产者和设置的对象)工作正常。
删除 Web 项目的这些 classes 并将具有这些相同 classes 的 jar 添加到 Web 项目(在 Maven 项目的 pom.xml 中设置此库)一切正常编译,就像以前一样。但是在启动服务器时,容器在 CDI 启动期间找不到现在存在于 jar 中的 classes(CDI bean),生成这个(著名的)错误:
WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)
已经在META-INF文件夹中添加了beans.xml作为src/main/resources(在WELD和CDI文档中指出)的根文件夹项目。
下面是 jar 中存在的 bean(Session、SessionFactory 和 ExampleLogger)示例,需要注入其他项目(并且在 class 在 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
一段时间后再次尝试我找到了解决方案 ─ 我将 beans.xml 放在 项目根目录中的 META-INF 文件夹中 文件夹,它成功了!这与 WELD 文档中关于如何在 jar 中使用 CDI bean 的描述相悖,其中说放置 beans.xml 的位置在 src/main/resources/META-INF 中,但没关系。也许在某些 Maven 项目中,确实如此。
[更新] 这是有效的,因为我是使用 Eclipse 的导出 jar 向导而不是使用 Maven 来构建 jar。使用 Maven 应该与 beans.xml in src/main/resources/META-INF.
一起正常工作希望这也能帮助其他人解决这种情况。
我在 Eclipse 中遇到了两个项目的相同症状。 WAR 项目从导入的 JAR 库项目中注入了实现。 Maven 全部正确编译,但在本地 运行 环境中的 运行 期间,bean 管理器无法解析库 bean,不稳定并发送提到的异常。
Eclipse 不使用 Maven 准备调试代码,它的 Project Facets 使用 Maven 插件配置。 Maven 依赖项在两个项目中都匹配,但问题出在 Eclipse 项目配置中。
我的环境是 JBoss EAP 6.4,我发现 Maven 插件设置了 JAR CDI 项目方面但保留了默认版本 2.0。 运行-时间实际上支持 CDI 1.0,WAR 项目中的 CDI 项目方面具有正确的版本。
在我的例子中,WAR 和导入的 JAR 项目中的 CDI 项目方面的不同版本导致了此异常。需要手动 Eclipse 项目方面版本更正。在 运行 时间环境和 Eclipse 项目方面之间匹配的 CDI 版本问题消失了。