2012-10-09 57 views
0

所以我有兩個ANT腳本使用Groovy來處理複雜的計算正常ANT無法做到(至少afaik)。我試圖通過Groovy使用SOAP-envelope訪問Axis2 Web服務。除了兩個complexType屬性(請求中的一個,響應中的一個)之外,請求和響應非常簡單。Axis2與Groovy中的複雜類型

我偶然發現的第一件事是Groovy肥皂。這很容易使用,你只需實例化一個SoapClient並調用Web服務方法。不幸的是它不能處理在請求complexType屬性,這是我需要:

電流限制:

....

4:自定義數據類型不能被使用的Groovy當在客戶端處理具有當前groovy-1.0版本的SOAP模塊。

然後我讀了很多關於GroovyWS。我在我的user.home中創建了我的Grape配置文件,提供了javac和$ GROOVY_HOME(基本上完成了project quick guide page中描述的所有操作)。葡萄以某種方式檢索艾維,當我第一次開始劇本時(我對葡萄沒有經驗,但我懷疑它與Maven非常相似)。

然後開始了我的簡單腳本:

@Grab(group='org.codehaus.groovy.modules', module='groovyws',version='0.5.2') 
import groovyx.net.ws.WSClient 
proxy = new WSClient("http://127.0.0.1/axis2/services/ReleaseService?wsdl", this.class.classLoader) 
proxy.initialize() 

不幸的是我甚至不能初始化網絡客戶端(不包括在classpath中的Groovy SOAP庫):

SEVERE: Could not compile java files for http://127.0.0.1/axis2/services/ReleaseService?wsdl. 
Caught: java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated: javax.xml.bind.JAXBException: "com.intershop.qa.tae.ws.xsd" doesnt contain ObjectFactory.class or jaxb.index java.lang.IllegalStateException: Unable to create JAXBContext for generated packages: Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated [...] 

隨着Groovy的SOAP庫(這似乎超載了一些GroovyWS的功能)在我已經得到的類路徑中:

Caught: java.lang.NoSuchMethodError: javax.wsdl.xml.WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; java.lang.NoSuchMethodError: 

,它看起來非常類似於我在第一次使用Groovy Soap時遇到的錯誤。

所以我的問題是:我如何通過ANT使用complexType參數Axis2 Web服務進行通信。我不僅僅限於Groovy,但出於部署的原因(約50個VM快照),我想要一些簡單的東西。一個Java客戶端的工作,但由於部署是相當費力(特別是如果我想改變未來的東西),我需要更接近ANT,更容易部署。

預先感謝其他技術的建議或修復了我的GroovyWS實現的想法。

+0

請在您最終制作時報告。除非指向另一個如此問題,否則我無法幫助您:[如何從Ant腳本或Jenkins內部調用Web服務?](http://stackoverflow.com/questions/8303365/how-to-call-a- Web服務 - 從 - 螞蟻腳本或由內而外地一詹金斯)。如果你想出更好的東西,你也可以回答這個問題。 – Jarekczek

+0

那麼問題是什麼?爲什麼GroovyWS從一開始就不工作? – Jarekczek

+0

Tbh我真的不知道。它甚至無法正確初始化。也許與葡萄有些問題。正如前面提到的,我相信它在使用Groovy Soap的時候仍然包含了庫。 –

回答

0

我終於想出了一個解決方案:groovy-wslight實際上解決了我的問題,終於能夠輕鬆地部署,沒有問題/異常訪問Web服務。

的腳本:

@Grab(group='com.github.groovy-wslite', module='groovy-wslite', version='0.7.1') 
import wslite.soap.* 
def client = new SOAPClient("http://127.0.0.1/axis2/services/ReleaseService") 
def response = client.send { 
    body { 
    myFunction(xmlns:"http://my.namespace.com") { 
     stringParameter("6.3.0.0") 
     status() { value("default") } 
     mode() { value("full") } 
    } 
    } 
} 

statusmodecomplexTypes其由一種 「value」 屬性的(作爲一個例子)。

println(response.myFunctionResponse.return) 

給我Web服務返回的對象。當然,令牌的名稱取決於WSDL。在我的情況下,請求的響應被稱爲myFunctionResponse,其中有一個字段name="return"並給我一個complexType對象。的對象的字段可以根據在給定的WSDL的名稱進行檢索:

println(response.myFunctionResponse.return.location) // gives me the field value of the field "location" for my complexType 
0

我使用JDK 1.7時也有類似的問題。切換到JDK 1.6爲我解決了它。