Альтернатива реализации Sun SAAJ SOAP - PullRequest
11 голосов
/ 12 февраля 2012

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

<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-сообщения с вложениями .
  • Реализация должна быть совместима с байт-кодом Java5.
  • Если реализация доступна в Maven Central, это плюс.

Ссылки:

Ответы [ 3 ]

7 голосов
/ 03 апреля 2012

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

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

  • org.apache.axis2.saaj.MessageFactoryImpl in 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 central ( здесь ).Множество зависимостей, размер 1,8 м, не рекомендуется.
  • 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 голосов
/ 03 апреля 2012

Жесткий.Возможно, посмотрите на один из выпусков 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.

0 голосов
/ 12 февраля 2012

Хотя я не знаю ответа на ваш точный вопрос, у меня есть решение, как вы можете заставить Sun 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).Решением является порт activesoap xerces, который является урезанной версией 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-WSRI (и SAAJ как его часть) под Java 5.

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

...