Metro in WebSphere 7 - com.ibm.xml.xlxp2.jaxb.JAXBContextImpl nicht kompatible Ausnahme

Problem

Entwicklung eines SOAP-Web-Services über Metro 2.0.1 ( webservices-rt.jar ), Integration mit Spring über` jaxws-spring-1.8.jar` und Bereitstellung auf WebSphere Application Server (WAS) Version 7.0 .0.13. Siehe Webservice unten:

Datei: UserWS.java

package com.mkyong.user.ws;//import...
@WebService()
public class UserWS {

    private UserBo userBo;

    @WebMethod(exclude = true)
    public UserBo getUserBo() {
        return userBo;
    }

    @WebMethod(exclude = true)
    public void setUserBo(UserBo userBo) {
        this.userBo = userBo;
    }

    @WebMethod(operationName = "listUser")
    public List<User> listUser() throws SOAPException {

       return userBo.listUser();

    }
}

Wenn alles in Ordnung ist, funktioniert der Dienst wie erwartet, aber wenn "userBo.listUser ()" auf einen Fehler gestoßen ist und eine "SOAPException" an den Client des Web-Services zurückgegeben wird:

Kunden bekommen dies:

Exception in thread "main"
    javax.xml.ws.WebServiceException: No Content-type in the header!

WAS-Protokolldatei mit folgendem Inhalt:

Caused by: java.lang.ClassCastException: com.ibm.xml.xlxp2.jaxb.JAXBContextImpl
    incompatible with com.sun.xml.bind.api.JAXBRIContext
    at com.sun.xml.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:561)
    at java.lang.J9VMInternals.initializeImpl(Native Method)
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
    ... 34 more

P.S Dieser Web-Service arbeitet mit Tomcat, ist aber nur für WebSphere fehlgeschlagen

Lösung

Die Datei "com.ibm.xml.xlxp2.jaxb.JAXBContextImpl" befindet sich unter WAS APPSERVER PROFILE \ plugins \ com.ibm.ws.prereq.xlxp.jar und der Metro-Bibliothek webservices-rt.jar der Instanz com.sun.xml.bind.v2.runtime.JAXBContextImpl . Wenn eine Ausnahme ausgelöst wird, verwendet WAS zwei verschiedene Instanzen, um dieselbe JAXB-Bindungsaufgabe auszuführen, und löst eine inkompatible Ausnahme „java.lang.ClassCastException“ aus.

Um dies zu beheben, stellen Sie sicher, dass WAS immer dieselbe Instanz verwendet.

  1. Setzen Sie im WAS-Konfigurationsbildschirm den Modulklassenlader auf

"** Elternteil zuerst".

  1. Erstellen Sie im WAS-Ordner einen Ordner " classes " im WAS-Stammverzeichnis und

Geben Sie "webservices-rt.jar" ein, zum Beispiel "WAS APPSERVER PROFILE \ classes \ webservices-rt.jar".

Starten Sie die WAS-Instanz neu, jetzt lädt WAS Ihre "webservices-rt.jar" immer. Ein schmutziger Weg, aber es funktioniert :).