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.
-
Setzen Sie im WAS-Konfigurationsbildschirm den Modulklassenlader auf
"** Elternteil zuerst".
-
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 :).