2016-08-24 11 views
4

Я создал проект Java, который будет использоваться в качестве lib для других проектов, что уменьшит дублирование кода между проектами. Этот проект lib экспортируется в jar для включения в веб-проекты (WAR, а не EAR).CDI beans внутри .jar не найдены контейнером (неудовлетворительные зависимости)

В веб-проектах (где эти классы удаляются) все работает как обычно, пока все классы хранятся на них. ─ Впрыск простых и сложных объектов (с производителями и настройками) работал нормально.

После удаления этих классов веб-проектов и добавления банки с этими же классами в веб-проекты (установка этой библиотеки в pom.xml в проектах Maven) все скомпилировано нормально, как и раньше. Но на старте сервера, классы (CDI бобы) в настоящее время в банке не найден в контейнере во время запуска КДИ, генерируя эту (известную) сообщение об ошибке:

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

Уже добавил beans.xml в папку META-INF как в файле src/main/resources (указанном в документах WELD и CDI), так и в корневой папке проекта.

enter image description here

Ниже приведены примеры фасолью (Session, SessionFactory и ExampleLogger) представляет в банке, который должен быть введен в другие проекты (и работали нормально, а класс был в веб-проектах), но сейчас не быть обнаруженным ИНП:

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

+1

Это __should__ работает, поэтому что-то не так в вашей настройке. Вы уверены, что банка включена в войну? Вы меняли имена пакетов аннотаций (отборочных)? Вы создали новый простой компонент в проекте jar и попытались его ввести в войну. Это работает? – Guenther

+0

Да, я пробовал это. Повторяя еще некоторое время назад, я нашел решение ─ Я поместил ** beans.xml ** в папку META-INF внутри корневой папки ** проекта **, и это сработало! Это противоречит описанию того, как работать с CDI-компонентами внутри банки в документации WELD, где говорится о месте размещения бобы.xml находится внутри src/main/resources/META-INF, но все в порядке. Во всяком случае, спасибо Гюнтеру. –

+1

Пожалуйста, загляните в свой '' 'beans.xml'''. Указывает ли он '' 'bean-discovery-mode =" annotated "' '', если это так, аннотировать классы-производители, по крайней мере, с '' 'ApplicationScoped''' – maress

ответ

2

снова Пытаюсь немного времени назад я нашел решение ─ Я поместил beans.xml папку META-INF внутри project root папка, и это сработало! Это противоречит описанию того, как работать с CDI-компонентами внутри баннеров в документации WELD, где говорится, что место для размещения beans.xml находится внутри src/main/resources/META-INF, но все в порядке. Возможно, в некоторых проектах Maven это правда.

[UPDATE] Это работает, потому что я строил банку с помощью мастера экспорта контейнеров Eclipse вместо того, чтобы использовать Maven для этого. Использование Maven должно отлично работать с beans.xml в src/main/resources/META-INF.

Надеюсь, это поможет другим в этой ситуации.

+1

В этом случае что-то не так с тем, как обрабатываются ресурсы в вашей настройке maven. Может быть, вы переопределили в своем пом, как копируются ресурсы? Документированная настройка с помощью src/main/resource/META-INF/beans.xml определенно работает, если вы не испортили ничего, что можно увидеть в многочисленных сообщениях, например. http://stackoverflow.com/questions/13056336/cdi-beans-xml-where-do-i-put-you – Guenther

+1

Я думаю, что он работает таким образом, потому что вы используете Eclipse для экспорта файла jar вместо использования артефакта, который построена Maven. В идеале вы должны использовать Maven для создания распределенных артефактов, потому что это повторяемый процесс, тогда как экспорт Eclipse может быть несколько изменен в зависимости от индивидуальной настройки пользователя. –

+0

@SteveC является правильным. Я использую мастер экспорта контейнеров Eclipse вместо использования Maven для этого. Использование Maven для сборки с beans.xml в указанном месте отлично работает. Спасибо вам, я очень ценю вашу помощь и внимание! –