容器找不到.jar中的CDI bean(不满意的依赖项)

时间:2016-08-24 00:12:48

标签: java-ee cdi weld jboss-weld

我创建了一个Java项目,作为其他项目的lib,减少了项目之间的代码重复。此lib项目将导出到 jar 以包含在Web项目中(WAR,而不是EAR)。

在Web项目中(这些类被删除的地方)一切正常,所有类都保留在它们上面 - 简单和复杂对象(具有生产者和设置的对象)的注入正常工作

删除这些类的Web项目并将具有这些相同类的jar添加到Web项目(在Maven项目中的pom.xml中设置此lib)后,所有内容都会正常编译,就像之前一样。但是在启动服务器时,容器在CDI启动期间找不到容器中存在的类(CDI bean),从而产生这个(着名的)错误:

WELD-001408: Unsatisfied dependencies for type Session with qualifiers (...)

已经在src / main / resources(在WELD和CDI文档中指出)的META-INF文件夹中添加 beans.xml 作为项目的根文件夹。

enter image description here

以下是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

2 个答案:

答案 0 :(得分:5)

一段时间后再尝试我找到了解决方案─我将 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。

希望这也可以帮助其他人处理这种情况。

答案 1 :(得分:2)

我在两个项目中都遇到了相同的症状。 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版本,问题就解决了。

相关问题