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

Dúvida no Ex. 4 da Aula 1 - Cache

Fiz o exercício e funcionou normal. Estou fazendo um projeto a parte para práticar todos os conhecimentos ao longo dos cursos.

Acontece que o cache não funcionou.

Meu cenário é: tenho uma página dividida em: um formulário de cadastro e em baixo uma listagem com os últimos 5 cadastros.

    @RequestMapping(method=RequestMethod.GET)
    @Cacheable(value="rpaView")
    public ModelAndView exibe(ReciboPagamentoAutonomo rpa){
        ModelAndView model = new ModelAndView("cadastros/rpa");

        List<Empresa> empresas = empresaDao.listar();
        List<ReciboPagamentoAutonomo> rpas = rpaDao.listarUltimosCinco();
        model.addObject("empresas", empresas);

        return model;
    }

fiz as configurações iguais ao do curso, meu AppWeb está com o @EnableCaching e com:

@Bean
    public CacheManager cacheManager(){
        CacheBuilder<Object, Object> builder = CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(5, TimeUnit.MINUTES);
        GuavaCacheManager manager = new GuavaCacheManager();
        manager.setCacheBuilder(builder);
        return manager;
    }

Isso não funcionou e acho que descobri o motivo, mas ainda não entendi.

fiz uns testes e criei uma página apenas com as listagens de empresa e os recibos sem o formulário de cadastro.

    @RequestMapping("/")
    @Cacheable(value="rpaView")
    public ModelAndView exibe(){
        ModelAndView model = new ModelAndView("index");

        List<Empresa> empresas = empresaDao.listar();
        List<ReciboPagamentoAutonomo> rpas = rpaDao.listarUltimosCinco();

        model.addObject("empresas", empresas);
        model.addObject("rpas", rpas);

    return model;
    }

A úncia coisa que mudou foi a assinatura do método, retirei o exibe(ReciboPagamentoAutonomo rpa) e passou a ser exibe().

Com isso o cache funciona perfeitamente no meu teste. Estou utilizando a tag <form:form> e <form:input> e para evitar o erro:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'reciboPagamentoAutonomo' available as request attribute

o instrutor lá no curso I seção 7 informou que precisa deixar dísponivel no request. motivo pelo qual o método recebe o Rpa.

Agora o que eu quero entender, qual o motivo de sem receber RPA no método funcionar o cache. e Recebendo não funciona.

4 respostas

Oi Vinícius,

Tente colocar @ModelAttribute no parâmetro RPA que você recebe no método exibe(). Ou talvez o Spring espere que você usa o BidingResult no parâmetro para obter os erros.

Tente uma das soluções para ver o que consegue de erros.

Abraço

Oi Paulo, obrigado pela resposta.

Eu solucionei da seguinte forma, não sei se está correto, mas funcionou! Como o cache é da consulta, coloquei o mapeamento @Cacheableno método da classe DAO.

Mas vou tentar isso que me falou.

solução!

Oi Vinícius,

Também pode ser usado. O que é melhor em fazer no controller é que ele consegue cachear a resposta html, sem precisar renderizar a jsp novamente. Mas no DAO já é uma boa economia de processamento também.

Abraço

Oi paulo! tentei utilizar @ModelAttribute apenas, e também depois o model + BindingResult, porém continou não funcionar o cache. Não sabia que ele cacheava a resposta html, bom saber. Mas considerando que no DAO funcionou, e já tenho a economia no processamento já me dou por satisfeito!

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