我创建了一个Java项目作为其他项目的lib,减少了项目之间的代码重复。此lib项目导出到jar以包含在Web项目中(WAR,而不是EAR)。
在Web项目中(这些类被删除的地方)一切正常,而所有类都保留在它们上面 - 注入简单和复杂的对象(具有生产者和设置的对象)正常工作。
删除这些类的Web项目并将具有这些相同类的jar添加到Web项目(在Maven项目中的pom.xml中设置此lib)之后,所有内容都会正常编译,就像之前一样。但是在启动服务器时,容器在CDI启动期间找不到现在存在于jar中的类(CDI bean),从而产生这个(着名的)错误:
WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)
已经在src / main / resources(在WELD和CDI文档中指出)的META-INF文件夹中添加了beans.xml作为项目的根文件夹。
下面是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项目中。有人遇到过这个问题吗?是否有人知道容器中存在罐中存在的豆子的解决方案?提前谢谢你,抱歉英语不好。
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项目中,这是真的。
[UPDATE]这是有效的,因为我使用Eclipse的导出jar向导而不是使用Maven来构建jar。使用Maven应该可以正常使用src / main / resources / META-INF中的beans.xml。
希望这也可以帮助其他人解决这个问题。
我在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版本问题已经消失。