8

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>

グルーヴィーなコードの一部:

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

だから私は代わりに何を渡す必要がありますか?

助けてくれてありがとう。

-vova。

4

3 に答える 3

6

GroovyWSは、Webサービス呼び出しにデータを渡すために必要な引数タイプごとにクラスを動的に作成します。たとえば、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がクラス名が実際にどうあるべきかを確認しました。

于 2010-07-25T06:34:07.613 に答える
5

ビルに感謝します。

将来の読者のためにいくつかの情報を追加したいと思います。

GrailsでGroovyWSのロギングをオンにするには:

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

ビルが述べたようにこれであなたはクラスの名前を見ることができます。


もう1つ: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

于 2010-07-28T07:58:19.420 に答える
3

ありがとう!GroovyWSを非常に複雑なWebサービスで動作させました!

私の手順:デバッグをオンにしてルートクラスを取得し、次にそのリフレクションコードを実行して内部クラスを取得し、プロパティの設定に進み、それが文字列かリストかを確認します。

そして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 << 'teste@wanswins.com.br'
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
于 2010-09-05T07:55:19.323 に答える