2012-02-12 132 views
9

我正在寻找除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像: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应用服务器 - 请根据我的喜好提供信息:

  • 实现应该很容易从分离休息的工作人员(最好是一个轻量级的罐子)。
  • 执行应该支持SOAP messages with attachments
  • 实现应该与Java5字节码兼容。
  • 如果实现在Maven Central中可用,这是一个优点。

参考文献:

回答

6

经过浏览后,我得到了以下潜在的问题解决方案。我使用grepcode.com探索了javax.xml.soap.MessageFactory的后代是什么。在org.apache.axis2:axis2-saaj:1.6.1

  • org.apache.axis2.saaj.MessageFactoryImpl

    除了标准com.sun.xml.messaging.saaj.soap.MessageFactoryImpl,我已经找到(像预想的那样)。此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中心之外找到这个罐子(here)。很多依赖关系,1.8M大小,不推荐。
  • org.apache.openejb.server.webservices.saaj.MessageFactoryImpl in org.apache.openejb:openejb-webservices:4.0.0-beta-2 and org.apache.geronimo.webservices.saaj.GeronimoMessageFactory in org.apache.geronimo.modules:geronimo-webservices:3.0-M1。实际上,这些工厂都是Axis2或Sun实现的wrapper/runtime_locator(请参阅SaajFactoryFinderSAAJFactoryFinder)。不被考虑。

底线:唯一可接受的选择是Axis2的实现。

+0

这可能会起作用。如果你没有成功使用Axis2,你可以考虑使用Spring WS,它应该从1.4开始支持JDK。 – TechTrip 2012-04-03 15:49:53

+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-IMPL 1.3.2'这是一个信号,即也许Spring-WS利用Sun SAAJ,他们以某种方式解决同样的问题。 – 2012-04-03 17:57:26

+0

是的,我的坏,呃。 – TechTrip 2012-04-03 20:20:22

0

虽然我不知道答案,你确切的问题,我有一个解决方案,您如何使太阳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> 

不介意奇怪包命名 - 只是尝试。

这通常是所有需要运行Sun JAX-WS RI(和SAAJ作为它的一部分)的Java 5

下不要忘记不包括任何JAXP API JAR文件。它们将与Java 5 JAXP API冲突。

+0

** rustyx **,非常感谢您的努力,但您的答案会走向错误的方向。我提到的配置文件完全符合您的建议:如果拉出Sun Xerces实现并因此解决了1.5 – 2012-02-12 19:02:57

+0

下的问题1)为什么不总是包含jaxp jar? 2)你确定你可以简单地换掉SAAJ而不移动到另一个JAX-WS堆栈? – rustyx 2012-02-12 21:16:26

+0

1)在你的classpath中有几个Xerces不好,可能会导致难以追踪的问题,因为在某些时候我不知道使用了什么Xerces。 2)我不知道。如果这是不可能的,我希望社区会这样说。另一方面,我看到'javax.xml.soap'中有另一个实现没有问题。为什么这应该迫使我切换到另一个堆栈? – 2012-02-12 21:58:05

0

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

您可能想要尝试翻转类加载器,将所需的jar包与您的Web应用程序捆绑在一起并加载到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一起打包)。 – 2012-04-03 14:36:04

+0

已经有几年了,但我必须在Websphere上做类似的事情。最后将类加载器翻转为父类,并且必须包含一些与我的Web服务冲突的核心jar。我不记得我必须包括的确切罐子。我从jaxp运行时开始,必须在排除过程中运行。 – TechTrip 2012-04-03 15:01:04

+0

我想,我发现了我的理论的批准:)检查我的答案。 – 2012-04-03 15:14:14