Я создаю приложение Java SE на основе Gradle, основанное на Hibernate, как и мой ORM. Мой план состоит в том, чтобы использовать weld-se
, чтобы иметь возможность использовать аннотации CDI для инъекций EntityManagers
во всем приложении.Проблемы с обнаружением бобов при использовании сварного шва с плагином приложения Gradle
на основе общего HibernateUtil
вспомогательного класса, найденного в документации Hibernate, я двинулся к JPA интерфейсов и добавил @Produces
аннотаций для обеспечения методов производителей (я добавил пустой META-INF/beans.xml
а):
package dao;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class HibernateUtil {
private static final EntityManagerFactory emf = buildEntityManagerFactory();
private static EntityManagerFactory buildEntityManagerFactory() {
try {
return Persistence.createEntityManagerFactory("persistenceUnit");
} catch (Throwable ex) {
System.err.println("Initial EntityManagerFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
@Produces
public static EntityManager createEntityManager() {
return emf.createEntityManager();
}
public static void closeEntityManager(@Disposes EntityManager em) {
System.out.println("Closing EM");
try {
em.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
Когда я попробуйте использовать @Inject
аннотации на поле, однако, Weld не удается решить правильный метод производителя и производит исключение вместо:
исключения в потоке «основные» org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Невозможно разрешить любые компоненты для Type: class app.DemoApplication; Квалификаторы: [@ javax.enterprise.inject.Any()] at org.jboss.weld.bean.builtin.InstanceImpl.get (InstanceImpl.java:101) at app.Main.main (Main.java:14)
вредоносный код, конкретизируется через контейнер Weld для поддержки CDI и невероятно просты:
package app;
import javax.inject.Inject;
import javax.persistence.EntityManager;
public class DemoApplication {
@Inject private EntityManager em;
public void run() {
try {
em.getTransaction().begin();
System.out.println("Inside transaction");
} catch (Throwable t) {
t.printStackTrace();
} finally {
em.getTransaction().rollback();
em.close();
}
}
}
Я отсутствует очевидный пункт здесь? Как я могу заставить Weld открыть метод производителя для ввода моих зависимостей?
Я собрал минимальный проект, воспроизводящий мою проблему на Github. Спасибо за любые полезные предложения! :)
Update 2015-05-18:
Кажется, я понял сообщение об ошибке. На самом деле, Weld даже не разрешает фасоль DemoApplication
, что заставляет меня поверить, что что-то не так с процессом обнаружения бобов. После обновления моего шва-с зависимости от недавно выпущенной версии 3.0.0.Alpha8 (см связанного GitHub репо), я был в состоянии получить приложение для работы вручную говоря Weld о моих бобах в Main.java
:
final Weld weld = new Weld()
.enableDiscovery()
.addPackage(false, HibernateUtil.class)
.addPackage(false, DemoApplication.class);
Тем не менее, любые предложения относительно того, почему бобы не открываются автоматически, несмотря на наличие пустого META-INF/beans.xml
, высоко оценены!
Update 2015-05-19:
Мистерия разгадали см свой ответ ниже. Я изменил название вопроса, чтобы отразить фактический характер проблемы.
Что такое 'bean-discovery-mode' в вашем' beans.xml'? –
@MilanBaran Я попытался использовать пустой beans.xml, а также один с 'bean-discovery-mode = ALL', оба без видимого эффекта. – AdrianoKF