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

Parâmetro tipo não está setando

Quando executo o método pelo SOAPUI ele não está setando o parâmetro tipo, retornando a exception Nullpointer na classe DAO.

EstoqueWS

@WebService
public class EstoqueWS {

    private ItemDao dao = new ItemDao();

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

Filtros

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

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

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

    Filtros() {
    }

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

}

ItemDAO

public class ItemDao {

    private static Map<String, Item> ITENS = new LinkedHashMap<>();

    public ItemDao() {
        popularItensNoMapa();
    }

    public void cadastrar(Item item) {
        ITENS.put(item.getCodigo(), item);
    }

    public ArrayList<Item> todosItens(List<Filtro> filtros) {

        ArrayList<Item> resultados = new ArrayList<Item>();
        Collection<Item> todosItens = ITENS.values();

        if (filtros == null || filtros.isEmpty()) {
            resultados.addAll(todosItens);
            return resultados;
        }

        for(Filtro filtro : filtros) {
            for (Item item : todosItens) {

                String tipo = filtro.getTipo().getNome();
                String nome = filtro.getNome();

                if(itemPossuiTipo(item, tipo) && itemPossuiNome(item, nome)){
                    resultados.add(item);
                }
            }
        }

        return resultados;
    }

    //este método existe apenas para facilitar o primeiro exercicio que não usa o filtro
    public ArrayList<Item> todosItens() {
        return new ArrayList<>(ITENS.values());
    }

    private boolean itemPossuiNome(Item item, String nome) {
        return item.getNome().contains(nome);
    }

    private boolean itemPossuiTipo(Item item, String tipo) {
        return item.getTipo().equals(tipo);
    }

    public Item quantidadeDo(String codigo) {
        return ITENS.get(codigo);
    }



    private void popularItensNoMapa() {
        ITENS.put("MEA", new Item.Builder().comCodigo("MEA").comNome("MEAN").comTipo("Livro").comQuantidade(5).build());
        ITENS.put("MEA", new Item.Builder().comCodigo("SEO").comNome("SEO na Prática").comTipo("Livro").comQuantidade(4).build());
        ITENS.put("RUB", new Item.Builder().comCodigo("RUB").comNome("Jogos com Ruby").comTipo("Livro").comQuantidade(8).build());
        ITENS.put("GAL", new Item.Builder().comCodigo("GAL").comNome("Galaxy Tab").comTipo("Tablet").comQuantidade(3).build());
        ITENS.put("IP4", new Item.Builder().comCodigo("IP4").comNome("IPhone 4 C").comTipo("Celular").comQuantidade(7).build());
        ITENS.put("IP5", new Item.Builder().comCodigo("IP5").comNome("IPhone 5").comTipo("Celular").comQuantidade(3).build());
        ITENS.put("IP6", new Item.Builder().comCodigo("IP6").comNome("IPhone 6 S").comTipo("Celular").comQuantidade(10).build());
        ITENS.put("MOX", new Item.Builder().comCodigo("MOX").comNome("Moto X").comTipo("Celular").comQuantidade(6).build());
        ITENS.put("MOG", new Item.Builder().comCodigo("MOG").comNome("Moto G").comTipo("Celular").comQuantidade(8).build());
        ITENS.put("MXX", new Item.Builder().comCodigo("MXX").comNome("Moto MAXX").comTipo("Celular").comQuantidade(2).build());
    }



}

Ago 15, 2016 12:17:48 PM com.sun.xml.internal.ws.server.sei.EndpointMethodHandler invoke GRAVE: null java.lang.NullPointerException at br.com.caelum.estoque.modelo.item.ItemDao.todosItens(ItemDao.java:35) at br.com.caelum.estoque.modelo.ws.EstoqueWS.getItens(EstoqueWS.java:25)

4 respostas
solução!

Opa, vc conferiu essa parte => https://cursos.alura.com.br/course/web-services-soap/section/2/task/7/opinion ? Republicou tudo?

Fala Alberto..

Sim, já havia conferido esse passo.

No SOAPUI está desta forma

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.modelo.estoque.caelum.com.br/">
   <soapenv:Header/>
   <soapenv:Body>
      <ws:todosOsItens>
         <!--Optional:-->
         <arg0>
            <!--Zero or more repetitions:-->
            <filtro>
               <!--Optional:-->
               <nome>?</nome>
               <!--Optional:-->
               <tipo>?</tipo>
            </filtro>
         </arg0>
      </ws:todosOsItens>
   </soapenv:Body>
</soapenv:Envelope>

Debugando o código vi que somente o parâmetro tipo não está sendo setado. O nome vem para o WS normalmente.

Alberto, consegui encontrar aqui.. Foi uma comida de bola gigante..rsrs.. estava passando o parâmetro errado para a variável tipo, aí ele não conseguia encontrar lá na Enum.

Obrigado pela ajuda.