barbitoff programmer`s blog

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

пятница, 22 марта 2013 г.

JAXWS-RI 2.1.4 на weblogic 10.3.5: java.lang.IllegalArgumentException: com.sun.xml.internal.messaging.sa aj.soap.LocalStrings != com.sun.xml.messaging.saaj.soap.LocalStrings

Проблема:

Есть приложение, использующее JAXWS-RI 2.1.4 (поставляется вместе с библиотеками ri в WEB-INF/lib), развернутое на weblogic 10.3.5. В начале при попытке вызова в приложении jaxws-клиента к удаленному веб-сервису падала ошибка:
java.lang.ExceptionInInitializerError
        at com.sun.xml.ws.api.addressing.WSEndpointReference.toSpec(WSEndpointReference.java:637)
...
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "address". Use @XmlType.name and @XmlType.namespace to assign different names to them.
После некоторых поисков решение было найдено тут: http://metro.java.net/guide/ch02.html#weblogic-10. В соответствии с этой инструкцией в weblogic.xml было прописано:
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
   <description>Weblogic Webapp</description>
   <container-descriptor>
      <prefer-application-packages>
         <package-name>com.ctc.*</package-name>
         <package-name>com.sun.xml.*</package-name>
         <package-name>com.sun.istack.*</package-name>
         <package-name>com.sun.msv.datatype.*</package-name>
         <package-name>com.sun.msv.driver.*</package-name>
         <package-name>com.sun.msv.grammar.*</package-name>
         <package-name>com.sun.msv.reader.*</package-name>
         <package-name>com.sun.msv.relaxns.*</package-name>
         <package-name>com.sun.msv.scanner.*</package-name>
         <package-name>com.sun.msv.util.*</package-name>
         <package-name>com.sun.msv.verifier.*</package-name>
         <package-name>com.sun.msv.writer.*</package-name>
         <package-name>com.sun.org.apache.xml.internal.*</package-name>
         <package-name>com.sun.wsit.*</package-name>
         <package-name>javax.jws.*</package-name>
         <package-name>javax.xml.bind.*</package-name>
         <package-name>javax.xml.soap.*</package-name>
         <package-name>javax.xml.stream.*</package-name>
         <package-name>javax.xml.ws.*</package-name>
         <package-name>javax.xml.activation.*</package-name>
         <package-name>javax.xml.annotation.*</package-name>
         <package-name>javax.xml.mail.*</package-name>
         <package-name>javax.xml.security.*</package-name>
         <package-name>javax.xml.registry.*</package-name>
         <package-name>javax.xml.rpc.*</package-name>
         <package-name>javax.xml.crypto.*</package-name>
         <package-name>javanet.staxutils.*</package-name>
         <package-name>jp.gr.xml.*</package-name>
         <package-name>org.codehaus.stax2.*</package-name>
         <package-name>org.glassfish.gmbal.*</package-name>
         <package-name>org.iso_relax.*</package-name>
         <package-name>org.jcp.xml.dsig.*</package-name>
         <package-name>org.jvnet.*</package-name>
         <package-name>org.relaxng.*</package-name>
         <package-name>org.apache.commons.*</package-name>
         <package-name>org.apache.xerces.*</package-name>
         <package-name>javax.namespace.xml.*</package-name>
      </prefer-application-packages>
      <prefer-application-resources>
         <resource-name>META-INF/services/javax.xml.ws.*</resource-name>
         <resource-name>META-INF/services/com.sun.xml.ws.*</resource-name>
         <resource-name>META-INF/services/com.sun.tools.ws.*</resource-name>
      </prefer-application-resources>
   </container-descriptor>
</weblogic-web-app>

А в WEB-INF/classes были закинуты классы в соответствие с п.3 раздела "Known Issues" по той же ссылке. 
Однако, счастья не наступило, ошибка превратилась в:
java.lang.IllegalArgumentException: com.sun.xml.internal.messaging.sa aj.soap.LocalStrings != com.sun.xml.messaging.saaj.soap.LocalStrings
При последующих вызовах стало падать просто:
java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.ws.api.BindingID  
Причина:

Причина в поставляемой с приложением библиотеке saaj-impl (она в него пришла вместе с зависимостью от JAXWS-RI), а именно в конфликте содержащегося в ней класса com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl с классом  com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl из rt.jar в JDK (подробнее причина описана тут: http://azagozdzinski.wordpress.com/2011/02/15/saaj-problem/). Сначала проблема вылечилась достаточно просто, добавлением в weblogic.xml следующей строки:
<prefer-application-resources>
<resource-name>META-INF/services/javax.xml.ws.*</resource-name>
<resource-name>META-INF/services/javax.xml.soap.*</resource-name>
<resource-name>META-INF/services/com.sun.xml.ws.*</resource-name>
<resource-name>META-INF/services/com.sun.tools.ws.*</resource-name>
</prefer-application-resources>
Однако, вскоре проблема вернулась обратно. Оказалось, на тот же weblogic было задеплоено другое приложение, также идущее со своим JAX-WS RI, однако более поздней версии - 2.2 (и соответственно, библиотеками saaj-api-1.3.4 и saaj-impl-1.3.19 против 1.3 и 1.3.1 соотв. в моем приложении). На этот раз беда решилась обновлением saaj в моем приложении до тех же 1.3.4 и 1.3.19.
Вот такие вот беды вызывает желание использовать несколько имплементаций JAX-WS в пределах одной JVM (в конечном счете их оказалось аж 3: родная имплементация weblogic'а, а также 2 разные версии jaxws-ri).

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

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