2012-03-27 10 views
1

Ich habe ein Problem mit der Injektion eines EntityManager von einem in der Testquelle zu einem Dienst in der Hauptquelle. Die Absicht ist, diese Bibliothek in ein anderes Projekt einzubetten, in dem das Projekt Producer unter Verwendung seines eigenen PersistenceContext unitName definieren würde. Wenn ich keinen Producer in den Hauptquellen habe, bekomme ich Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName MY_PU Fehler.CDI Klassenpfad Problem mit Maven und eingebetteten Glasfischen

Zum Beispiel:

/** src/main/java/org/sample/service */ 
@Stateless 
public class MyBean { 
    @Inject 
    @MyCustomQualifier 
    private EntityManager em; 
} 


/** src/test/java/org/sample/service */ 
public class EntityManagerProducer { 
    @Produces 
    @MyCustomQualifier 
    @PersistenceContext(unitName = "MY_PU") 
    private EntityManager em; 
} 

Damit mir den Dienst zu testen, muß ich die Maven-Ant-Plugin verwenden, um die * .class-Datei in den target/classes dir zu bewegen und es vor dem Paket Phase zu entfernen. Das funktioniert, aber es ist kludgy. Ich habe versucht, die <useSystemClassLoader> und <useManifestOnlyJar> Parameter im todsicheren Plugin ohne Erfolg zu ändern.

Gibt es einen anderen Weg?

Meine Umgebung

  • Maven: 2.2.1
  • todsichere: 2.4.2
  • Glassfish-embedded-all: 3.1.1

EDIT

beans.xml existiert in beiden (test/main)/resources/META-INF

Ich beginne den GF-Container wie folgt.

Map<String, Object> properties = new HashMap<String, Object>(); 
properties.put(EJBContainer.MODULES, new File[]{new File("target/classes"), new File("target/test-classes")}); 
EJBContainer ejbContainer = EJBContainer.createEJBContainer(properties); 
Context ctx = ejbContainer.getContext(); 
MyBean service = ctx.lookup("java:global/ejb-app/classes/MyBean"); 
+0

Klingt, als ob die Bibliotheken und Klassen im Projekt mit dem kollidieren, was Glassfish lädt. Ich hatte nie großes Glück mit eingebetteten Containern und Maven, weil Maven die Klassenpfade nicht sauber hält. Was passiert, wenn du Glassfish in einer neuen VM drehst? – LightGuard

+0

@LightGuard: Standardmäßig ist savefir forkMode 'once'. Der eingebettete Container sollte also in einer separaten JVM von Maven sein. [Verweis] (http://stackoverflow.com/questions/6813373/how-to-tell-maven2-to-execute-junit-tests-one-by-one-each-in-new-jvm-instance) – Hoon

Antwort

0

Nun, ich sehe nicht das Problem an allen ^^

Haben Sie eine src/test/resources/META-INF/beans.xml?

Und wie sieht dein Test aus? Arquillian, oder starten Sie den Container manuell? Haben Sie die persistence.xml mit der Persistenzeinheit MY_PU im Klassenpfad? Irgendein Github oder so, wo ich das Beispielprojekt betrachten kann?

Ich brauche ein bisschen mehr Informationen über die Umgebung, Ihnen zu helfen ...

+0

I verwende nicht Arquillian. Einfacher 'EJBContainer.createEJBContainer()' (Anmerkung edit oben). Ja, persistence.xml existiert im Klassenpfad. Entschuldigung, kein Github. – Hoon

+0

Troy, können Sie bitte versuchen Persistence.createEntityManagerFactory ("MY_PU"). CreateEntityManager()? Wenn das funktioniert, dann können wir weitere Schritte versuchen. Wenn dies Ihnen bereits einen ungültigen EM oder gar keinen gibt, dann stimmt etwas nicht mit Ihrer JPA-Installation oder mit Ihrer persistence.xml. – struberg

0

Wir hatten ein ähnliches Problem und herabgestuft 3.0.5 Maven.

Es scheint, dass das Problem in this Glassfish JIRA diskutiert wird. Ich konnte die Maven JIRA, die in der Diskussion erwähnt wird, nicht finden. Ich bin immer noch auf der Suche nach einer Möglichkeit, den neuesten Maven mit eingebettetem Glassfish zu verwenden, aber ich hatte nicht viel Glück.