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

Argumentos opcionais, só que nem tanto.

Na definição do envelope Soap, pelo o que o SoapUI monta para a gente, é:

 <ws:todosOsItens>
         <!--Optional:-->
         <arg0>
            <!--Zero or more repetitions:-->
            <filtro>
               <!--Optional:-->
               <nome>?</nome>
               <!--Optional:-->
               <tipo>?</tipo>
            </filtro>
         </arg0>
      </ws:todosOsItens>

E coloca os comentários <!--Zero or more repetitions:--> e <!--Optional:-->, só que, pelo que eu vi, é opcional nem tanto, já que se deixar os parâmetros vazios ou se removê-los , retorna um NullPointerException.

Não chega a ser bem uma pergunta, mas mais uma observação.

4 respostas

Oi Bruno,

os comentários do SoapUI se referem o contrato, ao WSDL. O SoapUI nao sabe se a implementação realmente precisa ou nao. O SoapUI olha apenas no contrato e nele os parâmetros ainda estão opcionais, ok?

abs

Opa Nico,

Nesse caso, por que o SoapUI entende esses parâmetros como opcionais?

E melhor, como dizer, através do contrato WSDL, que os parâmetros são obrigatórios para o funcionamento do método?

Value!

solução!

Oi Bruno,

A classe Filtros representa o modelo do serviço e nela devemos configurar a "obrigatoriedade". Como o JAX-B é responsável por criar esse XML a partir do objeto, é preciso mexer nas anotações do JAX-B.

Na classe Filtros, na anotação @XmlElement adicione o atributo required=true:

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

Use a anotação @XmlElement também na classe Filtro para configurar os atributos tipo e nome.

Tudo bem?

abs

Então Nico,

Era exatamente isso eu tava querendo saber, você foi uma excelente resposta! Apenas para acrescentar, quando eu implementei o que você falou, o xml gerado pelo SoapUI ficou:

<ws:TodosOsItens>
         <!--Optional:-->
         <filtros>
            <!--1 or more repetitions:-->
            <filtro>
               <tipo>?</tipo>
               <nome>?</nome>
            </filtro>
         </filtros>
      </ws:TodosOsItens>

O item filtrosainda ficou constando como opcional, então eu adicionei a anotação @XmlElement dentro da entrada do parâmetro e funcionou para resolver esse último detalhe!

@WebMethod(operationName = "TodosOsItens")
@ResponseWrapper(localName = "itens")
@WebResult(name = "item")
public List<Item> getItens(@WebParam(name = "filtros") @XmlElement(required=true, name="filtros") Filtros filtros) {
        System.out.println("Chamando getItens()");
        List<Filtro> listaFiltrada = filtros.getLista();
        List<Item> lista = dao.todosItens(listaFiltrada);

        return lista;
    }

Pode parecer um detalhe bobo, mas eu gosto de fazer a implementação mais clara possível para o usuário.

De toda forma, muito obrigado pela resposta!