2012-02-12 149 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