2012-02-12 3 views
9

Я ищу альтернативную реализацию SOAP (javax.xml.soap), отличную от Sun SAAJ. Причина этого в том, что я хотел бы развернуть JAX-WS WebService на IBM JDK 5, управляемом Tomcat AS, но известно, что реализация Sun SAAJ зависит от перераспределенных классов Xerces (см. Ref Impl does not work with IBM JDK и SAAJ test cases no longer work with IBM's SDK), и единственный выход для этого заключается в использовании пользовательского профиля Maven, чтобы тянуть com.sun.xml.parsers:jaxp-ri как:Альтернатива реализации Sun SAAJ SOAP

<profiles> 
    <profile> 
     <id>pre-jdk5-profile</id> 

     <activation> 
      <jdk>(,1.4]</jdk> 
     </activation> 

     <dependencies> 
      <dependency> 
       <groupId>com.sun.xml.parsers</groupId> 
       <artifactId>jaxp-ri</artifactId> 
       <scope>runtime</scope> 
      </dependency> 
     </dependencies> 
    </profile> 
</profiles> 

Я хотел бы бросить эту анкету и просто заменить реализацию SOAP с тем, которая работает во всем мире.

Я полагаю, что реализации поставщика SOAP может прийти с Apache Axis/Apache CXF (который основан на IBM SOAP4J) или JBoss AS - просьба представить информацию, основанную на моих предпочтениях:

  • Внедрение должно быть легко отделить от (предпочтительно одна легкая баночка).
  • Реализация должна поддерживать SOAP messages with attachments.
  • Реализация должна быть совместимой с байт-кодом Java5.
  • Если реализация доступна в Maven Central, это плюс.

Ссылки:

ответ

6

После просмотра я пришел к следующему потенциальному решению проблемы. Я изучил, каковы потомки javax.xml.soap.MessageFactory, используя grepcode.com.

Помимо стандартного com.sun.xml.messaging.saaj.soap.MessageFactoryImpl, я нашел (как предполагается):

  • org.apache.axis2.saaj.MessageFactoryImpl в org.apache.axis2:axis2-saaj:1.6.1. Этот JAR правильно объявляет заводы через META-INF\services\javax.xml.soap.MessageFactory и META-INF\services\javax.xml.soap.MetaFactory, поэтому никакой другой настройки не требуется. Эта версия (в соответствии с Maven Central) была выпущена в 2011 году, рекомендуется несколько зависимостей.
  • org.jboss.ws.core.soap.MessageFactoryImpl в org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2 от JBoss 3.x. Выглядит довольно старым, и, возможно, JBoss больше не поддерживает его разработку, так как мне удалось найти эту банку вне центра maven (here). Множество зависимостей, размер 1.8M, не рекомендуется.
  • org.apache.openejb.server.webservices.saaj.MessageFactoryImpl в org.apache.openejb:openejb-webservices:4.0.0-beta-2 и org.apache.geronimo.webservices.saaj.GeronimoMessageFactory в org.apache.geronimo.modules:geronimo-webservices:3.0-M1. На самом деле любая из этих фабрик является оберткой/runtime_locator для реализации Axis2 или Sun (см. SaajFactoryFinder и SAAJFactoryFinder). Не следует рассматривать.

Нижняя линия: единственной приемлемой альтернативой является реализация Axis2.

+0

Это может сработать. Если у вас нет успеха с Axis2, вы можете изучить Spring Spring, который должен работать с JDK с 1,4 до. – TechTrip

+1

(к сожалению) Из [spring-ws-parent-2.0.4.RELEASE.pom] (http://mirrors.ibiblio.org/pub/mirrors/maven2/org/springframework/ws/spring-ws-parent/2.0 .4.RELEASE/пружинные-WS-родитель-2.0.4.RELEASE.pom): ' com.sun.xml.messaging.saaj SAAJ-осущ 1.3.2', который является сигналом, который возможно, Spring-WS использует Sun SAAJ, и они каким-то образом обходят одну и ту же проблему. –

+0

Да, мой плохой, угх. – TechTrip

0

Хотя я не знаю ответа на ваш точный вопрос, у меня есть решение, как вы можете сделать Солнце SAAJ (и JAX-WS RI) работают под JRE 1.5. Причина, по которой возникают проблемы с запуском JAX-WS RI под Java 5, - это действительно устаревший JAXP (Java 1.5 поставляется с JAXP 1.3, а JAX-WS RI - JAXP 1.4), а потому, что JAX-WS RI жестко закодирован для использования Sun JAXP RI (com.sun.org.apache ...). Поскольку JAXP 1.3 является частью JRE, вы не можете просто заменить его (вы можете заменить реализацию, но не API). Решение - это порт xerces от activesoap, который представляет собой сокращенную версию JAXP 1.4, которая использует имена пакетов Sun JAXP RI (com.sun.org.apache.). Вы можете найти его в репо Maven:

<dependency> 
    <groupId>activesoap</groupId> 
    <artifactId>jaxb-xercesImpl</artifactId> 
    <version>1.5</version> 
</dependency> 

Не против странного пакета именование - просто попробуйте.

Это часто все, что необходимо для запуска Sun JAX-WS RI (и SAAJ как его часть) в Java 5.

Не забудьте не включать JAXP API JARs. Они будут конфликтовать с Java 5 JAXP API.

+0

** rustyx **, спасибо за ваши усилия, но ваш ответ идет в неправильном направлении. Профиль, о котором я упомянул, делает именно то, что вы предлагаете: если вытягивает реализацию Sun Xerces и, таким образом, решает проблему до 1,5 –

+0

1) почему не всегда включать банку jaxp? 2) вы уверены, что можете просто заменить SAAJ, не перейдя в другой стек JAX-WS? – rustyx

+0

1) Наличие нескольких Xerces в вашем пути к классу не является хорошим и может привести к проблемам, которые трудно отследить, так как в определенный момент я не знаю, какие Xerces используются. 2) Я не знаю. Если это невозможно, я надеюсь, что сообщество скажет это. С другой стороны, я не вижу проблемы в javax.xml.soap, имеющей другие реализации. Почему это должно заставить меня переключиться на другой стек? –

0

Жесткий. Возможно, посмотрите на один из выпусков Apache CXF. http://cxf.apache.org/

Возможно, вы захотите попробовать сбросить загрузчик классов, связав банки, которые вам нужны, с веб-приложением и загрузите их в модель PARENT_LAST. Вероятно, это ваш лучший выбор.

Третий вариант в Tomcat может быть одобренным механизмом переопределения стандартов, поддерживаемым на Java, и Tomcat.-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS

См. Здесь, я думаю, что это применимо к более старым версиям Tomcat: http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html#XML_Parsers_and_Java.

+1

Я знаю, что реализация SAAJ должна быть в CXF, но как ее использовать? Какие банки использовать? (ну, нет необходимости вставлять их в «одобренные», поскольку я использую IBM JDK, который не упакован с SAAJ). –

+0

Прошло несколько лет, но я должен был сделать что-то подобное на Websphere. перевернул загрузчик классов к родительскому последнему и должен был включить некоторые из основных ящиков, которые противоречили моей веб-службе. Я не могу вспомнить точные банки, которые мне пришлось включить. Я начал с runtime jaxp и должен был работать в процессе устранения. – TechTrip

+0

Я думаю, я нашел одобрение своей теории :) Проверьте мой ответ. –

Смежные вопросы