【问题标题】:Alternative to Sun SAAJ SOAP implementationSun SAAJ SOAP 实现的替代方案
【发布时间】:2012-02-12 13:16:36
【问题描述】:

我正在寻找替代 SOAP (javax.xml.soap) 实现,而不是Sun SAAJ。原因是我想在 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 中提供了实现,这是一个加分项。

参考资料:

【问题讨论】:

    标签: java web-services soap jax-ws


    【解决方案1】:

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

    除了标准的com.sun.xml.messaging.saaj.soap.MessageFactoryImpl,我发现(如假设的那样):

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

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

    【讨论】:

    • 这可能行得通。如果你在 Axis2 上没有成功,你可以考虑使用 Spring WS,它应该可以在 JDK 1.4 以上工作。
    • (不幸的是)来自spring-ws-parent-2.0.4.RELEASE.pom&lt;dependency&gt;&lt;groupId&gt;com.sun.xml.messaging.saaj&lt;/groupId&gt;&lt;artifactId&gt;saaj-impl&lt;/artifactId&gt;&lt;version&gt;1.3.2&lt;/version&gt;&lt;/dependency&gt; 这表明Spring-WS 可能利用了Sun SAAJ,并且它们以某种方式解决了同样的问题。
    【解决方案2】:

    虽然我不知道您的确切问题的答案,但我有一个解决方案,您可以如何使 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 冲突。

    【讨论】:

    • rustyx,感谢您的努力,但您的回答走错了方向。我提到的配置文件完全符合您的建议:如果拉取 Sun Xerces 实现,从而解决 1.5 下的问题
    • 1) 为什么不总是包含 jaxp jar? 2) 你确定你可以简单地换掉 SAAJ 而无需移动到另一个 JAX-WS 堆栈吗??
    • 1) 在你的类路径中有几个 Xerces 是不好的,并且可能会导致难以追踪的问题,因为在某些时候我不知道使用什么 Xerces。 2) 我不知道。如果这不可能,我希望社区会这么说。另一方面,我认为javax.xml.soap 有其他实现没有问题。为什么这会迫使我切换到另一个堆栈?
    【解决方案3】:

    艰难的。也许看看其中一个 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

    【讨论】:

    • 我知道SAAJ的实现应该在CXF中,但是如何利用呢?用什么罐子? (好吧,因为我用的是IBM JDK,所以没必要把它们放到endorsed,它没有和SAAJ一起打包)。
    • 已经有几年了,但我不得不在 Websphere 上做类似的事情。最后将类加载器翻转为父级,并且必须包含一些与我的 Web 服务冲突的核心 jar。我不记得我必须包括的确切罐子。我从 jaxp 运行时开始,不得不在消除过程中运行回来。
    • 我想,我的理论得到了认可:)检查我的答案。
    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2016-10-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多