문제

저는 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.

도움이 되었습니까?

해결책 2

많은 감사 청구서.

나는 미래의 독자들에게 몇 가지 정보를 추가하고 싶습니다.

GRAILS의 Groovyws에 대한 로깅을 켜십시오 :

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

다음과 같이 언급 한대로 클래스의 이름을 볼 수 있습니다.



한 가지 더 : parameters는 다른 유형을 가질 수 있습니다.List<?>가 아닙니다.그래서 그것도 너무 작성되어야합니다.

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

새로 생성 된 개체에 대한 사용 가능한 메서드 및 필드를 검색하려면 Groovy Reflection을 사용할 수 있습니다.

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

그게 다야!




--vova

다른 팁

groovyws는 데이터를 웹 서비스 호출에 전달하기 위해 필요한 각 인수 유형에 대한 클래스를 동적으로 만듭니다.예를 들어, WebService 호출이 었는지 :

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가 클래스 이름이 실제로 중요한 것으로 생각되는지 알 수 있습니다.

감사합니다!나는 정말로 복잡한 webservice와 함께 일하는 groovyws를 가지고있다!

내 단계 : 디버그를 켜려면 루트 클래스를 가져 와서 내부 클래스를 가져오고 속성 설정을 시작하고 문자열 또는 목록인지 확인합니다.

및 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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top