Ich bin eine Gradle-basierte Java SE-Anwendung auf Hibernate als mein ORM der Wahl gebaut. Mein Plan ist, weld-se
zu verwenden, CDI-Anmerkungen für Einspritzungen von EntityManagers
während der Anwendung zu verwenden.Bean Discovery Probleme bei der Verwendung von weld-se mit Gradle Anwendung Plugin
Auf der Grundlage der gemeinsamen HibernateUtil
Hilfsklasse in der Dokumentation Hibernate gefunden, zog ich in Richtung JPA-Schnittstellen und hinzugefügt @Produces
Anmerkungen Produzenten Methoden zur Verfügung zu stellen (ich habe eine leeres META-INF/beans.xml
ebenfalls berücksichtigt):
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();
}
}
}
Als ich versuchen, die @Inject
Anmerkung auf einem Feld zu verwenden, jedoch nicht Weld die richtige Producer-Methode und erzeugt eine Ausnahme statt zu beheben:
Exception in thread „main“ org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001308: Kann keine Beans für Type: class app.DemoApplication auflösen; Qualifier: [@ javax.enterprise.inject.Any()] bei org.jboss.weld.bean.builtin.InstanceImpl.get (InstanceImpl.java:101) bei app.Main.main (Main.java:14
)
der säumige Code wird für CDI Unterstützung durch den Weld Behälter instanziiert und ist unglaublich basic:
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();
}
}
}
Bin ich hier einen offensichtlichen Punkt fehle? Wie kann ich Weld dazu bringen, die Producer-Methode zum Injizieren meiner Abhängigkeiten zu finden?
Ich habe ein minimales Projekt zusammengestellt, das mein Problem auf Github reproduziert. Danke für hilfreiche Vorschläge! :)
-Update 2015.05.18:
Scheint, wie ich die Fehlermeldung falsch verstanden. Tatsächlich löst Weld nicht einmal die Bean DemoApplication
, was zu der Annahme führt, dass mit dem Bean-Discovery-Prozess etwas nicht stimmt. meine Schweiß-se Abhängigkeit auf die frisch frei 3.0.0.Alpha8 Version (siehe die verknüpfte Github Repo) Nach der Aktualisierung konnte ich die Anwendung erhalten, indem manuell zu sagen Weld über meine Bohnen in Main.java
zu arbeiten:
final Weld weld = new Weld()
.enableDiscovery()
.addPackage(false, HibernateUtil.class)
.addPackage(false, DemoApplication.class);
Dennoch sind alle Vorschläge, warum die Bohnen nicht automatisch entdeckt werden, obwohl sie leer sind META-INF/beans.xml
, sehr geschätzt!
-Update 2015.05.19:
Das Geheimnis enträtselt ist, meine eigene Antwort siehe unten. Ich habe den Titel der Frage geändert, um die tatsächliche Art des Problems wiederzugeben.
Was ist der "Bean-Discovery-Modus" in Ihrer 'beans.xml'? –
@MilanBaran Ich habe versucht, eine leere beans.xml, sowie eine mit 'bean-discovery-mode = ALL', beide ohne sichtbaren Effekt. – AdrianoKF