Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Return Web Service Soap NULL

Testando outras possibilidades, criei um Web Service e fazendo o teste do cliente pelo SoupUI eu obtenho o XML de retorno. Porém gerando o cliente pelo wsimport e fazendo a chamada via cliente, o meu retorno é uma lista vazia. Através de Sysout eu identifiquei que a requisição do meu cliente chega até o Web Service porém não obtenho o retorno, portanto acredito que o problema esteja em pegar o retorno.

Segue método do meu Web Service


    @WebMethod(operationName="BuscarTodasAsPessoas")
    @WebResult(name="pessoa")@ResponseWrapper
    @RequestWrapper(localName="BuscarTodasAsPessoas")
    @ResponseWrapper(localName="BuscarTodasAsPessoasResponse")
    public List<Pessoa> buscarTodasAsPessoas() {
        System.out.println("Buscando pessoas...");        
        return daoPes.buscarPessoas();
    }

Segue implementação do cliente

    public static void main(String[] args) {
        // TODO Auto-generated method stub


        AvisoWSService avisoWSService = new AvisoWSService();
        AvisoWS avisoWS = avisoWSService.getAvisoWSPort();

        List<Pessoa> listPessoa = avisoWS.buscarTodasAsPessoas();        
         System.out.println(listPessoa.size());
    }

Aqui está o response que obtenho no SoupUI da mesma request do cliente

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:BuscarTodasAsPessoasResponse xmlns:ns2="http://ws.soap.aviso.poc.com.br/">
         <pessoa>
            <cpf>11122233301</cpf>
            <nome>Maria</nome>
            <sexo>M</sexo>
            <telefone>44441111</telefone>
            <email>maria@gmail.com</email>
         </pessoa>
         <pessoa>
            <cpf>11122233300</cpf>
            <nome>José</nome>
            <sexo>M</sexo>
            <telefone>44441111</telefone>
            <email>jose@hotmail.com</email>
         </pessoa>
      </ns2:BuscarTodasAsPessoasResponse>
   </soap:Body>
</soap:Envelope>
4 respostas

Oi Weberton, se a chamada ta caindo no mesmo método, o lista do dao deveria retornar a mesma lista :). Pode mostrar o código de consumo? De todo jeito, quando a invocação chega no método do seu webservice, o dao retorna o que?

solução!

Olá, boa tarde !!

Esse é o código de consumo...

    public static void main(String[] args) {        
        AvisoWSService avisoWSService = new AvisoWSService();
        AvisoWS avisoWS = avisoWSService.getAvisoWSPort();

        List<Pessoa> listPessoa = avisoWS.buscarTodasAsPessoas();

        listPessoa.forEach(p -> System.out.println("pessoa : " + p.getNome()));
    }

Sim, está passando pelo mesmo metodo dao, e o metodo retorna uma lista de pessoas, E pelo que andei pesquisando o problema parece estar ai.

No meu service, o JAX-B não consegue parsear(mapear) essa minha List<Pessoa> (vinda do dao) em um Elemento XML e por isso no Cliente eu recebo uma lista vazia.

esse é o meu service :

    @WebMethod(operationName="BuscarTodasAsPessoas")
    @WebResult(name="pessoa")
    @RequestWrapper(localName="BuscarTodasAsPessoas")
    @ResponseWrapper(localName="BuscarTodasAsPessoasResponse")
    public List<Pessoa> buscarTodasAsPessoas() {
        System.out.println("Buscando pessoas...");        
        return daoPes.buscarPessoas();
    }

No entanto, não sei como solucionar esse problema. Alguma sugestão

Tenta fazer assim, cria uma classe que é um wrapper para essa lista. Ex:

@XmlRootElement
public class ListaPessoas {
   private List<Pessoa> pessoas = new ArrayList<>();
   //get e set
}

No seu código, faz assim:

public List<Pessoa> buscarTodasAsPessoas() {   
       List<Pessoa> pessoas = daoPes.buscarPessoas();
       ListaPessoas retorno = new ListaPessoas();
       retorno.setPessoas(pessoas);
        return retorno;
    }

Aí gera novamente as coisas e testa...

Haa sim vlww pela dica, realmente eu criei uma classe wrapper e funcionou, no entanto o método está retornando a própria classe wrapper, e não um List<>

segue o código

    @WebMethod(operationName="BuscarTodasAsPessoas")
    @WebResult(name="pessoa")    
    @RequestWrapper(localName="BuscarTodasAsPessoas")
    @ResponseWrapper(localName="pessoas")
    public ListaPessoas buscarTodasAsPessoas() {
        System.out.println("Buscando todas as pessoas...");
        List<Pessoa> itensResultado = daoPes.buscarTodasAsPessoas();
        return new ListaPessoas(itensResultado);
    }

Muito Obrigadoo !!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software