Sun SAAJ SOAP实现的替代方案

时间:2012-02-12 13:16:36

标签: java web-services soap jax-ws

我正在寻找除Sun SAAJ之外的替代SOAP(javax.xml.soap)实现。原因是因为我想在IBM JDK 5驱动的Tomcat AS上部署JAX-WS WebService,但是已知问题是Sun SAAJ实现依赖于重新分配的Xerces类(请参阅Ref Impl does not work with IBM JDKSAAJ test cases no longer work with IBM's 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 messages with attachments
  • 实现应该与Java5字节码兼容。
  • 如果在Maven Central中可以实现,这是一个加号。

参考文献:

3 个答案:

答案 0 :(得分:7)

浏览后,我得到了以下潜在的问题解决方案。我使用grepcode.com探索了javax.xml.soap.MessageFactory的后代。

除标准com.sun.xml.messaging.saaj.soap.MessageFactoryImpl外,我发现(假设):

    org.apache.axis2:axis2-saaj:1.6.1
  • org.apache.axis2.saaj.MessageFactoryImpl。此JAR通过META-INF\services\javax.xml.soap.MessageFactoryMETA-INF\services\javax.xml.soap.MetaFactory正确宣布工厂,因此无需进行其他调整。这个版本(根据Maven Central)于2011年发布,很少有依赖,推荐。
  • 来自JBoss 3.x的org.jboss.ws.core.soap.MessageFactoryImpl中的
  • org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2。看起来相当古老,也许JBoss不再支持它的开发,因为我能够在maven central(here)之外找到这个jar。很多依赖项,1.8M大小,不推荐。
  • org.apache.openejb.server.webservices.saaj.MessageFactoryImpl位于org.apache.openejb:openejb-webservices:4.0.0-beta-2org.apache.geronimo.webservices.saaj.GeronimoMessageFactory位于org.apache.geronimo.modules:geronimo-webservices:3.0-M1。实际上,这些工厂中的任何一个都是Axis2或Sun实现的包装器/ runtime_locator(请参阅SaajFactoryFinderSAAJFactoryFinder)。不予考虑。

底线:唯一可接受的替代方案是Axis2实施。

答案 1 :(得分:0)

虽然我不知道您确切问题的答案,但我有一个解决方案,您可以如何使Sun SAAJ(和JAX-WS RI)在JRE 1.5下运行。在Java 5下运行JAX-WS RI的问题确实是过时的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端口,它是一个使用Sun JAXP RI包命名(com.sun.org.apache。)的简化JAXP 1.4版本。 你可以在Maven回购中找到它:

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

不要介意奇怪的软件包命名 - 只需尝试一下。

这通常是在Java 5下运行Sun JAX-WS RI(以及SAAJ作为其一部分)所需的全部内容。

请勿忘记不要包含任何JAXP API JAR。它们将与Java 5 JAXP API发生冲突。

答案 2 :(得分:0)

艰难的一个。也许看一下Apache CXF版本。 http://cxf.apache.org/

您可能想要尝试翻转类加载器,将您需要的jar与Web应用程序捆绑在一起并加载到PARENT_LAST模型中。这可能是你最好的选择。

Tomcat中的第三个选项可能是Java和Tomcat支持的Endorsed Standards Override Mechanism。 -Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS

请看这里,我认为它适用于较早版本的Tomcat:http://tomcat.apache.org/tomcat-6.0-doc/class-loader-howto.html#XML_Parsers_and_Java