2010-07-23 13 views
8

Ho riscontrato un problema con l'invio di richieste complesse con GroovyWS.GroovyWS e richieste complesse

Questo è richiesta campione generato da 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> 

il pezzo di codice Groovy:

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

Quindi quello che dovrebbe passare al posto di ?.

Grazie per il vostro aiuto.

-vova.

risposta

5

Mille grazie Bill.

Voglio solo aggiungere alcune informazioni per i futuri lettori.

Per attivare la registrazione per GroovyWS in Grails:

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

Con questo come Bill accennato è possibile vedere i nomi delle classi.


Un'altra cosa: parameters potrebbe essere di tipo diverso. Non List<?>. Ecco perché dovrebbe essere creato anche

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

Per recuperare metodi disponibili e campi per gli oggetti appena creati è possibile utilizzare la riflessione Groovy:

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

Questo è tutto!

-vova

6

GroovyWS crea dinamicamente classi per ciascuno dei tipi di argomento necessari per passare i dati alla chiamata al servizio web. Per esempio, se la chiamata è stata webservice:

public int passSomeArgs(Arg1Type a, Arg2Type b); 

GroovyWS creerebbe dinamicamente una classe Arg1Type e una classe Arg2Type, che si poteva accedere attraverso un metodo sul proxy.

// 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"); 

È possibile quindi popolare l'/ istanza arg2 arg1 con i dati ed effettuare la chiamata:

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

Nota, ci sono probabilmente alcuni spazi dei nomi coinvolti nelle classi di essere creati. Ho usato la registrazione CXF che è stata stampata mentre GroovyWS stava elaborando il WSDL per vedere cosa CXF pensava che i nomi di classe dovessero effettivamente essere.

3

Grazie! Ho ottenuto GroovyWS lavorando con un webservice davvero complesso!

I miei passaggi: ho attivato il debug per ottenere la classe radice, poi ho fatto quel codice di riflessione per ottenere le classi interne, e ho continuato ad impostare le proprietà e controllare se si tratta di stringa o lista.

E voilá!

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