2010-07-23 67 views
8

我遇到了使用GroovyWS發送複雜請求的問題。GroovyWS和複雜請求

這是由soapUI的生成樣品要求:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:dex="http://www.temp.com/com/dex" 
> 
<soapenv:Header/> 
<soapenv:Body> 
    <dex:executeRequest> 
    <!--Optional:--> 
    <a>?</a> 
    <!--Optional:--> 
    <b>?</b> 
    <!--Optional:--> 
    <parameters> 
     <!--Zero or more repetitions:--> 
     <parameter> 
      <!--Optional:--> 
      <key>?</key> 
      <!--Optional:--> 
      <value>?</value> 
     </parameter> 
    </parameters> 
    <!--Optional:--> 
    <c>?</c> 
    <!--Optional:--> 
    <d>?</d> 
    </dex:feedrequest> 
</soapenv:Body> 
</soapenv:Envelope> 

片的Groovy代碼:

def proxy = webService.getClient(grailsApplication.config.ws.endpoint); 
proxy.processdRequest(?); 

所以,我應該通過代替

感謝您的幫助。

-vova。

回答

5

非常感謝比爾。

我只是想爲未來的讀者添加一些信息。

要Grails中啓用日誌記錄GroovyWS:

log4j = { 
    debug 'grails.app', 
     'groovyx.net.ws', 
     'org.apache.cxf' 
} 

以此爲提到比爾,你可以看到類的名稱。


還有一件事:parameters可能有不同的類型。不是List<?>。這就是爲什麼它應該被創建。

def params = proxy.create('com.temp.feeds.FeedRequestType$Parameters'); 

要檢索新創建的對象可用的方法和字段,你可以使用Groovy反思:

params.class.methods.each{ 
     println it; 
} 
params.class.fields.each{ 
     println it; 
} 

這一切!

-vova

6

爲了將數據傳遞給Web服務調用,GroovyWS爲您需要的每個參數類型動態創建類。例如,如果web服務電話是:

public int passSomeArgs(Arg1Type a, Arg2Type b); 

GroovyWS將動態創建一個Arg1Type類和Arg2Type類,你可以通過對代理的方法訪問。

// this will instantiate an Arg1Type for you 
def arg1 = proxy.create("ns1.ns2.Arg1Type"); 
// this will instantiate an Arg2Type for you 
def arg2 = proxy.create("ns1.ns2.Arg2Type"); 

然後,您可以使用數據填充ARG1/arg2的情況下,讓您的來電:

int ret = proxy.passSomeArgs(arg1, arg2); 

注意,也有可能參與類的一些命名空間創建。我使用了作爲GroovyWS正在處理WSDL的CXF日誌記錄來查看CXF認爲類名實際上應該如何。

3

謝謝!我得到GroovyWS與一個非常複雜的Web服務工作!

我的步驟:我打開調試獲得根類,然後做反射代碼來獲取內部類,然後繼續設置屬性並檢查它是否是字符串或列表。

和瞧!

def proxy = new WSClient(wsdl,this.class.classLoader) 
proxy.initialize() 

def f2bCobranca = proxy.create("br.com.f2b.soap.wsbilling.F2BCobranca") //got with debug on 

//Show me inner classes of root class 
f2bCobranca.class.fields.each { log.debug it } 
f2bCobranca.class.methods.each { log.debug it } 

f2bCobranca.cobranca = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca') 
f2bCobranca.cobranca.demonstrativo << 'teste' //it's a list! 
f2bCobranca.cobranca.sacadorAvalista = 'teste jose' 
f2bCobranca.cobranca.desconto = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Desconto') 
f2bCobranca.cobranca.multa = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Cobranca$Multa') 

def sacado1 = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado') 
sacado1.nome = "teste ${new Date()}" 
sacado1.email << '[email protected]' 
sacado1.endereco = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Endereco') 
sacado1.telefone = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$Telefone') 
sacado1.telefoneCom = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCom') 
sacado1.telefoneCel = proxy.create('br.com.f2b.soap.wsbilling.F2BCobranca$Sacado$TelefoneCel') 
sacado1.cpf = '' 
sacado1.cnpj = '' 
sacado1.observacao = '' 
f2bCobranca.sacado << sacado1 

def retorno = proxy.RegisterWSBilling(f2bCobranca) 
log.debug retorno