2016-05-10 12 views
0

Wir verwenden Oracle Weblogic Server 10.3.6. Es enthält zur Laufzeit OpenJPA und EclipseLink im Klassenpfad. Wir aktivieren JPA2 mit der folgenden Zeile in der commEnv.cmd:Hibernate Validator verwendet falschen Persistence Provider

set PRE_CLASSPATH=BEA_HOME\modules\javax.persistence_1.1.0.0_2-0.jar; 
%BEA_HOME%\modules\com.oracle.jpa2support_1.0.0.0_2-1.jar 

Wenn wir Bean Validation mit validator.validate() verwenden, gibt es folgende AbstractMethodError: org.apache.openjpa.persistence.PersistenceProviderImpl.getProviderUtil() Ljavax/Persistenz/Spi/ProviderUtil;

Es funktioniert, wenn wir javax.persistence_1.0.0.0_1-0-2.jar statt javax.persistence_1.1.0.0_2-0.jar konfigurieren, aber wir brauchen 2.0. Und offensichtlich verwendet der Validierungsanbieter OpenJPA, aber er sollte Eclipselink verwenden.

Zur Entwicklungszeit verwenden wir den Hibernate Validator. Aber welcher Validierungsanbieter verwendet Weblogic und wie können wir den Validierungsanbieter zwingen, Eclipselink als Persistenz-Provider zu verwenden? Was bedeutet die Fehlermeldung?

+0

Warum sollte eine BeanValidation API-Implementierung JEDE JPA-Implementierung verwenden? Was lässt dich sagen, dass es so ist? Wo ist der Stack-Trace, der das sagt? Ein JPA-Provider kann eine BeanValidation-API-Implementierung verwenden ... dh umgekehrt –

+0

Wenn ich hibernate.ValidatorImpl.validate() aufruft, wird ein Fehler mit der Nachricht: org.apache.openjpa.persistence.PersistenceProviderImpl.getProviderUtil() Ljavax zurückgegeben/Persistenz/spi/ProviderUtil. Das bedeutet, der Hibernate-Validator verwendet den Persistenzanbieter. Irgendeine Idee? – Fireworx

+0

POST THE STACK TRACE .... in Ihrer Frage! –

Antwort

0

Hier die Lösung: Weblogic hat unter bestimmten Umständen mehr als einen Persistenzprovider im Klassenpfad. In meinem Fall OpenJPA basierend auf JPA1 und EclipseLink basierend auf JPA2 (Favourite). Der Hibernate-Validator verwendet die Logik aus der Persistence-Klasse des angegebenen API-Pakets, um den Persistenzanbieter zu erhalten. Diese Implementierung ruft eine Methode auf diesem Persistenzprovider auf, die zuerst gefunden wird - und OpenJPA wird zuerst in meinem Fall gefunden. Wenn der Hibernate-Validator JPA1-API verwendet und die Methode auf OpenJPA basierend auf JPA1 aufruft, läuft alles gut. Aber wenn es die JPA2-API verwendet und die Methode auf dem alten OpenJPA aufruft, gibt es den AbstractMethodError, weil die Methode seit JPA2 neu ist. Um dies zu beheben, musste ich die Eclipselink.jar zum Pre-Classpath hinzufügen. Dann ist Eclipselink immer der erste Persistenzanbieter, der gefunden wird und alles läuft gut. API und Implementierung stimmen überein.

set PRE_CLASSPATH=BEA_HOME\modules\javax.persistence_1.1.0.0_2-0.jar; 
%BEA_HOME%\modules\com.oracle.jpa2support_1.0.0.0_2-1.jar; 
%BEA_HOME%\modules\org.eclipse.persistence_1.2.0.0_2-3.jar; 
Verwandte Themen