2016-05-17 3 views
0

Ich habe drei Bündel. Im ersten Paket habe ich persistence.xml. Und ich habe zwei Klassen: A und B. A erweitert B. Klasse A ist @Entity, Klasse B ist @ MappedSuperclass.Both Klassen sind in persistence.xml aufgeführt. Pakete der 2'dn und 3'd Bundles werden exportiert.Eclipselink: OSGi Bündel, Vererbung und Weben

Wenn Klasse A und Klasse B im selben Paket sind - alles in Ordnung. Wenn jedoch der Klasse A in der zweiten Bündel und der Klasse B, die das dritte Paket ist erhalte ich:

WARNING: EMFProxy invocation on method createEntityManager failed: Exception: Exception [EclipseLink-30005] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: [email protected] 
Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [myPersistenceUnit] failed. 
Internal Exception: java.lang.NullPointerException 
java.lang.NullPointerException: null 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.createClassDetails(TransformerFactory.java:270) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.addClassDetailsForMappedSuperClasses(TransformerFactory.java:124) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.buildClassDetailsAndModifyProject(TransformerFactory.java:180) 
    at org.eclipse.persistence.internal.jpa.weaving.TransformerFactory.createTransformerAndModifyProject(TransformerFactory.java:84) 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1972) 
    at org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:100) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:104) 
    at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:188) 
    at org.eclipse.gemini.jpa.ProviderWrapper.createEntityManagerFactory(ProviderWrapper.java:128) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.createEMF(EMFServiceProxyHandler.java:151) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.syncGetEMFAndSetIfAbsent(EMFServiceProxyHandler.java:127) 
    at org.eclipse.gemini.jpa.proxy.EMFServiceProxyHandler.invoke(EMFServiceProxyHandler.java:73) 
    at com.sun.proxy.$Proxy8.createEntityManager(Unknown Source) 

Als ich in persistence.xml gesetzt

<property name="eclipselink.weaving" value="false"/> 

Ich habe keine Ausnahmen, aber Alle Felder der Klasse B werden ignoriert. Wie man dieses Problem löst?

+0

Setzen Sie die EclipseLink-Protokollierung auf den Feinsten oder alle und überprüfen Sie die Protokolle, während EclipseLink während der Bereitstellung jede Klasse lädt, um zu sehen, ob alle Klassen übernommen werden. Es sollte dann Warnungen oder Fehler anzeigen, die verhindern könnten, dass das "B" geladen wird. – Chris

+0

@Chris Vielen Dank für Ihre Zeit. Es hat nicht geholfen, aber es hat einen Hinweis gegeben - ich habe bemerkt, dass irgendwelche Klassen von einem des Bündels ignoriert werden und schließlich den Grund herausgefunden haben. Siehe meine Antwort. –

+0

@Chris By the way, ist die irgendeine Möglichkeit machen einige Maven-Bundle persistence.xml Klassen lesen und fehlende Pakete zu manifes hinzufügen? Oder andere gute Lösungen? –

Antwort

0

Das Problem war im ersten Bündel. Es hat keine Pakete aus dem Bundle mit der Klasse B importiert, da sein Code nichts über die Klasse B wusste. Also musste ich die Manifest-Datei des ersten Pakets des Pakets osgi directive import - Klasse B hinzufügen. Das Problem in EclipseLink ist, dass es selbst mit dem Protokollierungslevel All keine Ausnahmen über die Klasse nicht gefunden oder ähnliches ausgelöst hat.