2017-11-01 3 views
0

Ich erhalte eine ClassCastException, wenn Eclipselink DescriptorCustomizer für Verlauf verwendet.ClassCastException mit Eclipselink DescriptorCustomizer

Meine Customizer-Klasse wie folgt aussieht:

public class MyCustomizer implements DescriptorCustomizer { 
    @Override 
    public void customize(ClassDescriptor classDescriptor) thorws Exception { 
     // Setting HistoryPolicy here. 
    } 
} 

Das Unternehmen mit Anmerkungen versehen ist:

@Customizer(full.packagename.MyCustomizer.class)

im EJB-Modul in einem Maven-Projekt Dies erfolgt, die wie strukturiert:

  • root
    • Ohr
    • ejb
    • Krieg

Die Eclipslink Abhängigkeit ist:

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>eclipselink</artifactId> 
    <version>2.6.3</version> 
    <scope>provided</scope> 
</dependency> 

Der Code auf WebSphere Freiheit 17.0.0.2 läuft, auf dem es keine anderen Anwendungen bereitgestellt. Das Eclipselink-Jar befindet sich im globalen Lib-Verzeichnis des Servers.

Wenn die Eclipse zunächst versucht, die Einheit ich die folgende Ausnahme zuzugreifen:

MyCustomizer cannot be cast to org.eclipse.persistence.config.DescriptorCustomizer

ich die Eclipse im Antrag des Paket enthalten versucht, aber das Ergebnis ist das gleiche. Was kann das richtige Casting verhindern und wie kann ich es beheben?

EDIT # 1

Ich habe die Eclipse Abhängigkeit:

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>org.eclipse.persistence.core</artifactId> 
    <version>2.6.3</version> 
    <scope>provided</scope> 
</dependency> 

Da es nicht das javax.persistence Paket so enthält es nicht mit dem Websphere internen stören können.

Wenn ich manuelle Anwendung in der Anwendung zu Testzwecken mache, dann gibt es keine Ausnahme. Die ClassCastException wird ausgelöst, wenn getCriteriaBuilder() im EntityManager aufgerufen wird.

Antwort

0

Nach einigen Stunden des Leidens gibt es eine Lösung für dieses Problem:

Der Anwendungsteil OK war.

Ich musste die server.xml folgendermaßen ändern: Für den Classloader der Anwendung musste ich die apiTypeVisibility = "spec, ibm-api, Third-Party" anhängen. Da ich eine bestimmte Bibliothek verwendet habe, musste ich diesen Spezifizierer auch dort anhängen.

So die relevanten Teile des server.xml:

<library id="appLibrary" apiTypeVisibility="spec, ibm-api, third-party"> 
... 
</library> 

<application id="app_ear" ...> 
    <classloader commonLibraryRef="appLibrary" apiTypeVisibility="spec, ibm-api, third-parth"> 
</application>