2010-07-23 9 views
8

मुझे ग्रोवीडब्ल्यूएस के साथ जटिल अनुरोध भेजने की समस्या का सामना करना पड़ा है।ग्रोवीडब्ल्यूएस और जटिल अनुरोध

यह 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> 

ग्रूवी कोड का टुकड़ा:

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

तो क्या मैं के बजाय पारित करना चाहिए?

आपकी मदद के लिए धन्यवाद।

-वोवा।

उत्तर

5

बहुत धन्यवाद बिल।

मैं सिर्फ भविष्य के पाठकों के लिए कुछ जानकारी जोड़ना चाहता हूं। उल्लेख बिल के रूप में

log4j = { 
    debug 'grails.app', 
     'groovyx.net.ws', 
     'org.apache.cxf' 
} 
इस के साथ

आप वर्गों के नाम देख सकते हैं:

Grails में GroovyWS के लिए लॉगिंग चालू करने के।


एक और बात: parameters में अलग-अलग प्रकार हो सकते हैं। List<?> नहीं। यही कारण है कि इसे भी बनाया जाना चाहिए।

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

उपलब्ध तरीकों और नव निर्मित वस्तुओं के लिए क्षेत्रों को पुनः प्राप्त करने के लिए आप ग्रूवी प्रतिबिंब का उपयोग कर सकते हैं:

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

सब है कि!

-वोवा

6

ग्रोवीडब्लूएस वेब सेवा कॉल पर डेटा पास करने के लिए आपको आवश्यक तर्क प्रकारों के लिए गतिशील रूप से कक्षाएं बनाता है। उदाहरण के लिए, यदि वेब सेवा फोन था:

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

ध्यान दें, वहाँ शायद कुछ नामस्थान कक्षाओं में शामिल बनाया जा रहा है। मैंने सीएक्सएफ लॉगिंग का इस्तेमाल किया जो प्रिंट किया गया था क्योंकि ग्रोवीडब्लूएस डब्लूएसडीएल को प्रोसेस कर रहा था यह देखने के लिए कि सीएक्सएफ ने सोचा कि क्लास नाम वास्तव में क्या होना चाहिए।

3

धन्यवाद! मुझे ग्रोवीडब्ल्यूएस वास्तव में जटिल webservice के साथ काम कर रहा है!

मेरे चरणों: मैं डिबग चालू जड़ वर्ग पाने के लिए है, तो उस प्रतिबिंब कोड इनर क्लासों मिलता है, और स्थापित करने के गुणों पर जाने के लिए और अगर यह स्ट्रिंग या सूची है की जाँच करने के लिए किया था।

और 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 
संबंधित मुद्दे