Проблема:
Есть веб-приложение, которое тащит с собой (в WEB-INF/lib) api и имплементацию JAXB, а именно, jar-ники:
- jaxb-api.jar - версии 2.1
- jaxb-impl.jar - версии 2.1.4
В приложении используется JAX-WS клиент к веб-сервису. При попытке отправить с помощью него запрос валится:
java.lang.ExceptionInInitializerError
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:239)
...
Caused by: java.lang.ClassCastException: com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.<clinit>(SOAPFaultBuilder.java:488)
...
Что примечательно, проблема не воспроизводится на Tomcat 7, а вылезает только на Tomcat 6.
Причина:
Причина ClassCastException заключается в данном случае в том, что один класс (JAXBContextImpl) тянется из jaxb-impl в WEB-INF, а второй (JAXBRIContext) - из стандартной имплементации JAX-WS из JDK. Первый грузится ClassLoader`ом каталины, второй же - bootstrap`ом. Однако почему-то на 7ом томкате это не приводит с ClassCastException.
Решение:
Раз уже приложение идет со своим JAXB, то и JAX-WS придется также поставлять с ним. В моем случае это означало добавление в pom-ку зависимости:
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.1.4</version>
<scope>runtime</scope>
</dependency>
Комментариев нет:
Отправить комментарий