Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Curso Spring MVC 1 - Criando aplicações WEB - Erro ao finalizar compra

Quando fui finalizar a compra, apareceu a seguinte mensagem quando foi executar a instrução:

String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal() ), String.class);

Erro:

java.lang.IllegalArgumentException: Session must not be null
    at org.springframework.util.Assert.notNull(Assert.java:112)
    at org.springframework.web.util.WebUtils.getSessionMutex(WebUtils.java:365)
    at org.springframework.web.context.request.ServletRequestAttributes.getSessionMutex(ServletRequestAttributes.java:244)
    at org.springframework.web.context.request.SessionScope.get(SessionScope.java:91)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:336)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.getTarget(CglibAopProxy.java:685)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:636)
    at br.com.casadocodigo.loja.model.CarrinhoCompras$$EnhancerBySpringCGLIB$$145a0673.getTotal(<generated>)
    at br.com.casadocodigo.loja.controller.PagamentoController.lambda$0(PagamentoController.java:40)
    at org.springframework.web.context.request.async.WebAsyncManager$4.run(WebAsyncManager.java:322)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)

Eu testei no Postman o envio JSON para a URL http://book-payment.herokuapp.com/payment e funcionou corretamente.

Alguém passou por esse problema?

4 respostas

Olá Bispo!

Me manda o código do seu PagamentoController pra eu dar uma olhada por favor? Pode ser por aqui mesmo. Use a função de "Inserir Código".

Aguardo seu retorno!

Segue o conteúdo da classe PagamentoController:

package br.com.casadocodigo.loja.controller;

import java.util.concurrent.Callable;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.loja.model.CarrinhoCompras;
import br.com.casadocodigo.loja.model.DadosPagamento;

@Controller
@RequestMapping("/pagamento")
public class PagamentoController {

    @Autowired
    private CarrinhoCompras carrinho;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value="/finalizar", method=RequestMethod.POST)
    public Callable<ModelAndView> finalizar( RedirectAttributes model ) {

        // -> Teste de performance  http://jmeter.apache.org/

        return () -> {

            String uri = "http://book-payment.herokuapp.com/payment";

            try {

                String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal() ), String.class);
                System.out.println( response );
                model.addFlashAttribute("sucesso", response );

                return new ModelAndView("redirect:/produto");

            } catch (Exception e) { // catch (HttpClientErrorException e)
                e.printStackTrace();
                model.addFlashAttribute("falha", "Falha ao consumir " + uri + " - " + e.getMessage() );

                return new ModelAndView("redirect:/produto");

            }

        };

    }

}

Valeu.

Olá Bispo!

Peço desculpas pela demora.

Pode ser que por você ter usado a classe genérica Exception no seu try/catch ele esta retornando esse erro.

Ele está falando algo sobre sessão então talvez o erro está vindo de outra classe (provavelmente a do Carrinho).

Tenta deixar seu PagamentoController dessa forma e veja se continua dando o erro:

@Controller
@RequestMapping("/pagamento")
public class PagamentoController {

    @Autowired
    private CarrinhoCompras carrinho;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private MailSender sender;

    @RequestMapping(value="/finalizar", method=RequestMethod.POST)
    public ModelAndView finalizar(@AuthenticationPrincipal Usuario usuario, RedirectAttributes model){
        String uri = "http://book-payment.herokuapp.com/payment";

        try {
            String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal()), String.class);
            model.addFlashAttribute("message", response);
            System.out.println(response);

            //método para tirar todos os livros do carrinho
            this.carrinho.limpa();

            enviaEmailCompraProduto(usuario);

            return new ModelAndView("redirect:/");
        } catch (HttpClientErrorException e) {
            e.printStackTrace();
            model.addFlashAttribute("message", "Valor maior que o permitido! Compra negada!");
            return new ModelAndView("redirect:/");
        }
    }
}

Essa foi a forma que usei no projeto da formação Java.

Caso o erro ainda persista peço que me mande seu projeto para que eu possa dar uma olhada.

Aguardo seu retorno!

solução

Olá Guilherme,

Eu já concluí o módulo e não mudei nada, mas resolveu.

Acredito que tenha sido algo relacionado à minha internet.

Obrigado pelo contato.