Metro в WebSphere 7 - несовместимое исключение com.ibm.xml.xlxp2.jaxb.JAXBContextImpl

Проблема

Разработал веб-сервис 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]ссылка://тег/веб-сервисы/[веб-сервисы]ссылка://тег/веб-сфера/[веб-сфера]