Проблема
Разработал веб-сервис SOAP через
Metro
2.0.1 (
webservices-rt.jar
), интегрировал с
Spring
через` jaxws-spring-1.8.jar` и развернул на
WebSphere Application Server
(WAS) версии 7.0 .0.13. Смотрите веб-сервис ниже:
File: 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();
}
}
Если все в порядке, служба работает должным образом, но, когда «userBo.listUser ()» выдает ошибку и выдает SOAPException обратно клиенту веб-службы:
Клиент получает это:
Exception in thread "main"
javax.xml.ws.WebServiceException: No Content-type in the header!
Файл журнала WAS, показывающий это:
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 Этот веб-сервис работает в Tomcat, но не работает только в WebSphere
Решение
Com.ibm.xml.xlxp2.jaxb.JAXBContextImpl
находится по адресу
WAS
APPSERVER
PROFILE \ plugins \ com.ibm.ws.prereq.xlxp.jar
и библиотеки Metro
webservices-rt.jar
, также содержат один экземпляра
com.sun.xml.bind.v2.runtime.JAXBContextImpl
. При возникновении исключения WAS использует два разных экземпляра для выполнения одной и той же задачи привязки JAXB и создает исключение «java.lang.ClassCastException».
Чтобы это исправить, просто убедитесь, что WAS всегда использует один и тот же экземпляр.
, На экране конфигурации WAS установите загрузчик класса модуля в
« Родитель-первых ».
, В папке WAS создайте папку « classes » в корневой папке WAS и
поместить
webservices-rt.jar
внутри, например,` WAS
APPSERVER
PROFILE \ classes \ webservices-rt.jar`.
Перезапустите экземпляр WAS, теперь WAS всегда будет загружать ваш
webservices-rt.jar
. Грязный путь, но это работает :).
ссылка://тег/jax-ws/[jax-ws]ссылка://тег/metro/[metro]ссылка://тег/веб-сервисы/[веб-сервисы]ссылка://тег/веб-сфера/[веб-сфера]