1
resposta

Filtrar lista com parâmetro Calendar via GET

Olá, estou começando com o Spring e tenho uma dúvida.

Estou tentando retornar uma lista de Produtos em Json quando acessar "relatorio-produtos". Essa lista de produtos vai ser filtrada a partir de uma data (Calendar) passada via GET (relatorio-produtos?data=2017-3-21).

Controller

@RequestMapping(value = "/relatorio-produtos/{data}", method = RequestMethod.GET)
@ResponseBody
public List<Produto> listaFiltroDataJSON(@PathVariable("data") Calendar dataLancamento) {
    List<Produto> produtos = dao.findPorData(dataLancamento);
    return produtos;
}

DAO

public List<Produto> findPorData(Calendar dataLancamento) {
    return manager.createQuery("select distinct(p) from Produto p join fetch p.precos precos where p.dataLancamento > :dataLancamento", Produto.class)
    .setParameter("dataLancamento", dataLancamento)
    .getResultList();
}

Quando tento acessar recebo o seguitne erro no console:

Erro

Failed to convert value of type 'java.lang.String' to required type 'java.util.Calendar'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.PathVariable @org.springframework.format.annotation.DateTimeFormat java.util.Calendar] for value '2018-07-27'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2018-07-27]

Alguém tem uma dica de como eu poderia continuar?

PS.: Estou tentando fazer o teste da Formação Desenvolvedor Java.

1 resposta

Bom dia Cristian.

A mensagem de log indica um erro de conversão na função listaFiltroDataJSON, no parâmetro dataLancamento.

Tente fazer o seguinte:

@RequestMapping(value = "/relatorio-produtos/{data}", method = RequestMethod.GET)
@ResponseBody
public List<Produto> listaFiltroDataJSON(@PathVariable("data") String dataLancamento) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
    dataLancamentoCalendar = cal.setTime(df.parse(dataLancamento));

    List<Produto> produtos = dao.findPorData(dataLancamentoCalendar);
    return produtos;
}

Acredito que seja mais ou menos isso. Espero ter ajudado.