2016-08-24 85 views
4

我创建了一个Java项目作为其他项目的lib,减少了项目之间的代码重复。这个lib项目被导出到jar被包含在Web项目中(WAR,而不是EAR)。容器中找不到.jar中的CDI bean(不满意的依赖关系)

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

在删除这些Web项目的类并将具有相同类的jar添加到Web项目(在Maven项目的pom.xml中设置此lib)之后,所有内容都正常编译,就像以前一样。但在启动服务器,类(CDI豆)现在存在于罐子不是由容器CDI的启动过程中发现,这产生(著名)的错误:

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

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

enter image description here

下面是豆(会话,会话工厂和ExampleLogger)的例子呈现在需要被注入到其它项目的jar(并已正常工作,而类是在Web项目),但现在是由CDI发现:在Maven项目和非Maven项目发生

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()); 
    } 
} 

的问题也是如此。有没有人遇到过这个问题?有没有人知道在容器中找到的罐子中存在的豆子的解决方案?预先感谢您,并为糟糕的英语感到遗憾。

的Java EE7,CDI 1.1,WELD 2.1,服务器WildFly 8.1

+1

这__should__工作,所以你的设置中有什么错误。你确定这个罐子是否包含在战争中?您是否更改了注释的名称(限定符)?你是否在jar项目中创建了一个新的简单bean,并试图在战争中注入它。那样有用吗? – Guenther

+0

是的,我已经尝试过。稍后重试我找到了解决方案─我将** beans.xml **放置在项目**根文件夹**中的META-INF文件夹中,并且它工作正常!这与WELD文档中有关如何使用CDI bean工作的描述是一致的,这里提到放豆的地方。xml在src/main/resources/META-INF中,但没关系。无论如何,谢谢Guenther。 –

+1

请看看你的'''beans.xml'''。它是否指定'''bean-discovery-mode =“注释”''',如果是,注释生产者类,至少使用''ApplicationScoped''' – maress

回答

2

再次尝试一点点时间前,我已经找到了解决方案─我把的beans.xml在META-INF文件夹中的内项目根目录文件夹,它的工作!这与如何在WELD文档的jar文件中使用CDI bean的描述相反,其中说beansize的放置位置在src/main/resources/META-INF中,但没关系。也许在一些Maven项目中,这是真的。

[UPDATE]这是有效的,因为我使用Eclipse的导出jar向导来构建jar,而不是使用Maven来执行此操作。使用Maven应该可以在src/main/resources/META-INF中的beans.xml中正常工作。

希望这可以帮助其他人在这种情况下。

+1

在这种情况下,资源在您的Maven安装中处理的方式出了问题。也许你在你的pom中重新定义了资源是如何被复制的?在许多帖子中可以看到,如果你还没有弄乱任何东西,那么使用src/main/resource/META-INF/beans.xml进行记录的设置就可以正常工作。 http://stackoverflow.com/questions/13056336/cdi-beans-xml-where-do-i-put-you – Guenther

+1

我认为它的工作方式是这样的,因为你使用Eclipse来导出jar文件,而不是使用artefact由Maven构建。理想情况下,您将使用Maven构建分布式文物,因为这是一个可重复的过程,而Eclipse导出可能会根据用户的个人设置而有所不同。 –

+0

@SteveC是对的。我正在构建使用Eclipse的导出jar向导,而不是使用Maven来执行此操作。使用Maven在指定位置使用beans.xml进行构建可以正常工作。谢谢你们,我非常感谢你们的帮助和关注! –

相关问题