barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

суббота, 9 февраля 2013 г.

com.sun.xml.bind.v2.runtime.JAXBContextImpl cannot be cast to com.sun.xml.internal.bind.api.JAXBRIContext

Проблема:

Есть веб-приложение, которое тащит с собой (в 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>


Комментариев нет:

Отправить комментарий