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

SOAPUI nao entrega o valor preenchido

Bom dia a todos, peço ajuda a vocês, meu SOAPUI está enviando parametro Filtros null no metodo

public ListaItens getItens(@WebParam(name="filtros") Filtros filtros)

O SOAP recebe esse retorno:

 <S:Body>
      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>S:Server</faultcode>
         <faultstring>java.lang.NullPointerException</faultstring>
      </S:Fault>
   </S:Body>
  <soapenv:Body>
      <ws:todosOsItems>
         <!--Optional:-->
         <ws:filtros>
            <!--1 or more repetitions:-->
            <filtro>
               <!--Optional:-->
               <nome>Moto</nome>
               <!--Optional:-->
               <tipo>Celular</tipo>
            </filtro>
         </ws:filtros>
      </ws:todosOsItems>
   </soapenv:Body>
@WebMethod(operationName="todosOsItems")
        @WebResult(name="itens")
        public ListaItens getItens(@WebParam(name="filtros") Filtros filtros){
             System.out.println("Chamando getItems");

             List<Filtro> lista = filtros.getLista();
             List<Item> itensResultado = dao.todosItens(lista);

             return new ListaItens(itensResultado);
}
@XmlRootElement()
@XmlAccessorType(XmlAccessType.FIELD)
public class Filtros {

    //@XmlElement(name="filtro")
    @XmlElement(name="filtro", required=true)
    private List<Filtro> filtros;

    public Filtros() {

    }

    public Filtros(List<Filtro> filtros) {
        this.filtros = filtros;
    }


    public List<Filtro> getLista() {
        return filtros;
    }

}
7 respostas

Marco,

parece ser uma NullPointerException na execução do servidor.

Você tem o Stack Trace?

Marco,

Consegui reproduzir o problema.

A questão é o namespace ws na frente da tag <filtros>.

<!-- Não pode ter o ws! -->
<ws:filtros>
    <!-- ... -->
</ws:filtros>

O namespace ws deve ser usado apenas antes do nome da operation, que é o método lá do WebService.

A tag <filtros> é parte do corpo da mensagem de input. Por isso, não deve ter o namespace.

Remova o ws de filtros.

<ws:todosOsItems>
         <!-- sem o ws: antes de filtros -->
         <filtros>
            <filtro>
               <nome>Moto</nome>
               <tipo>Celular</tipo>
            </filtro>
         </filtros>
      </ws:todosOsItems>

Deve funcionar!

Funcionou sim, muito obrigado pela ajuda.

Agora surgiu outra situação, porque eu alterei no soap deu certo.

O método está assim:

public ListaItens getItens(@WebParam(name="filtros")Filtros filtros ){

Se eu remover a anotacao @WebParam, fica arg0 e da mesma forma nao fica automatico na chamada pelo SOAP.

Pelo video mostrado funcionou sem essa necessidade. Como devo fazer ?

Marco... Seria legal criar um outro tópico no fórum, já que é outra pergunta. E se puder marcar como solução! ;)

Como eu removo

a tag

<ws:filtros>

do wsdl

ele pega do param

public ListaItens getItens(@WebParam(name="filtros")Filtros filtros ){
            System.out.println("Chamando getItems");
             List<Filtro> lista = filtros.getLista();
             List<Item> itensResultado = dao.todosItens(lista);


             return new ListaItens(itensResultado);
        }

Se eu entendi bem, você quer remover a tag <filtros>, para que o corpo do envelope fique assim:

<ws:todosOsItems>
            <filtro>
               <nome>Moto</nome>
               <tipo>Celular</tipo>
            </filtro>
            <filtro>
               <nome>Jogos</nome>
               <tipo>Livro</tipo>
            </filtro>
</ws:todosOsItems>

Se for isso, basta não usar a classe Filtros, mas uma List<Filtro> diretamente.

A implementação do WebService no servidor ficaria assim:

@WebMethod(operationName = "todosOsItens")
@WebResult(name = "itens")
public ListaItens getItens(@WebParam(name = "filtro") List<Filtro> filtros) {
    System.out.println("Chamando getItens");
    List<Item> itensResultado = dao.todosItens(filtros);
    return new ListaItens(itensResultado);
}

Não esqueça de regerar os requests no SoapUI, clicando com o botão direito no EstoqueWSPortBinding e em Update Definition.

EstoqueWSPortBinding

Vale escolher as seguintes opções, para manter parte das suas configurações, se possível (nem sempre é).

SoapUI Update Definition

solução!

Consegui remover, no meu caso tive que tirar a anotacao

//@XmlRootElement()
//@XmlAccessorType(XmlAccessType.FIELD)
public class Filtros {