Buduję aplikację Javy opartą na Gradle opartą na gradacji Hibernate jako ORM z wyboru. Moim planem jest użycie weld-se
, aby móc korzystać z adnotacji CDI do iniekcji EntityManagers
w całej aplikacji.Problemy z odkryciem fasoli podczas korzystania z funkcji spawania z wtyczką aplikacji Gradle
podstawie wspólnej klasy HibernateUtil
pomocnika znaleźć w dokumentacji hibernacji, przeniosłem się do interfejsów WZP i dodał @Produces
adnotacje dostarczenie sposobów wytwórca (Dodałem pusty META-INF/beans.xml
również):
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();
}
}
}
Kiedy spróbuj użyć @Inject
adnotacji na polu, jednak nie rozwiązuje Weld właściwą metodę producent i wywołuje wyjątek zamiast:
wyjątek w wątku „main” org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Nie można rozpoznać żadnych komponentów bean dla Type: class app.DemoApplication; Kwalifikatory: [@ javax.enterprise.inject.Any()] at org.jboss.weld.bean.builtin.InstanceImpl.get (InstanceImpl.java:101) na app.Main.main (Main.java:14)
Kod wykraczająca jest tworzony przez pojemnik Weld wsparcia CDI i jest bardzo podstawowe:
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();
}
}
}
jestem brakuje oczywisty punkt tutaj? Jak mogę sprawić, aby Weld odkrył metodę producenta do wstrzykiwania moich zależności?
Połączyłem minimalny projekt odtwarzający mój problem na Github. Dzięki za wszelkie pomocne sugestie! :)
Aktualizacja 18.05.2015:
Wydaje się, że źle się komunikat o błędzie. W rzeczywistości Weld nawet nie rozwiązuje fasoli DemoApplication
, co prowadzi mnie do przekonania, że coś jest nie tak z procesem odkrywania fasoli. Po zaktualizowaniu mojego uzależnienia spoiny-se świeżo wydany 3.0.0.Alpha8 wersji (patrz powiązany GitHub repo), udało mi się dostać do pracy aplikację ręcznie mówi Weld o moich fasoli w Main.java
:
final Weld weld = new Weld()
.enableDiscovery()
.addPackage(false, HibernateUtil.class)
.addPackage(false, DemoApplication.class);
Nadal bardzo cenne są wszelkie sugestie, dlaczego ziarna nie są automatycznie wykrywane, mimo że puste META-INF/beans.xml
są na miejscu!
Aktualizacja 19.05.2015:
Tajemnica jest niewyjaśniona, zobacz moje własne odpowiedzi poniżej. Zmieniłem tytuł pytania, aby odzwierciedlić rzeczywisty charakter problemu.
Co to jest 'bean-discovery-mode' w twoim' beans.xml'? –
@MilanBaran Próbowałem użyć pustego pliku beans.xml, a także jednego z 'bean-discovery-mode = ALL', bez żadnego widocznego efektu. – AdrianoKF