Sun SAAJ SOAP实现的替代方案

11

我正在寻找除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 - 请根据我的偏好提供信息:
- 实现应易于与其他内容分离(最好是一个轻量级jar)。 - 实现应支持带附件的SOAP消息。 - 实现应与Java5字节码兼容。 - 如果实现在Maven Central中可用,则此为加分项。
参考资料:
3个回答

7

浏览过后,我找到了下面可能的问题解决方案。使用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中央库)于2011年发布,依赖较少,推荐使用。
  • org.jboss.ws.core.soap.MessageFactoryImpl 在 JBoss 3.x 的 org.jboss.ws.native:jbossws-native-core:3.2.1.Beta2 中。看起来比较老,也许JBoss不再支持它的开发,因为我能在maven中央库之外找到这个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及以上版本上运行。 - TechTrip
1
很遗憾,从spring-ws-parent-2.0.4.RELEASE.pom中可以看到<dependency><groupId>com.sun.xml.messaging.saaj</groupId><artifactId>saaj-impl</artifactId><version>1.3.2</version></dependency>,这表明Spring-WS可能使用了Sun SAAJ,并且他们以某种方式解决了同样的问题。 - dma_k

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端口,这是一个精简的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 JAR文件。它们会与Java 5 JAXP API发生冲突。


rustyx,感谢您的努力,但是您的回答走了错误的方向。我提到的配置文件正是按照您所建议的方式进行操作:如果拉取Sun Xerces实现,因此在1.5下解决了问题。 - dma_k
  1. 为什么不总是包含jaxp jar?
  2. 你确定可以简单地替换SAAJ而不迁移到另一个JAX-WS堆栈吗?
- rustyx
  1. 在您的类路径中有多个Xerces并不好,并且可能会导致难以追踪的问题,因为在某些时刻我不知道使用了哪个Xerces。
  2. 我不知道。如果不可能,我希望社区能说出来。另一方面,我认为javax.xml.soap有其他实现也没有问题。为什么这应该迫使我切换到另一个堆栈?
- dma_k

0

有点难。也许可以看一下Apache CXF的其中一个版本。http://cxf.apache.org/

您可能希望尝试翻转类加载器,将您需要的jar打包到您的Web应用程序中,并以PARENT_LAST模式加载。这可能是您最好的选择。

在Tomcat中的第三个选项可能是Java和Tomcat支持的Endorsed标准覆盖机制。 -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中,但如何利用它?使用哪些JAR包?(好吧,由于我使用IBM JDK,它没有打包SAAJ,所以不需要将它们放入“endorsed”中)。 - dma_k
已经过了几年,但我在Websphere上不得不做类似的事情。将类加载器翻转到父级最后,并且必须包含一些与我的Web服务冲突的核心JAR文件。我记不清我必须包含哪些确切的JAR文件了。我从jaxp运行时开始,必须进行逐步排除的过程。 - TechTrip
我觉得我已经找到了对我的理论的认可 :) 请检查我的答案。 - dma_k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接