1
resposta

NullPointerException ao finalizar compra

Olá, tudo bem?

Poderiam me ajudar a entender o erro? Quando eu tento finalizar a compra, retorna esse erro na parte de encontrar o email do usuario.

java.lang.NullPointerException
    at br.com.casadocodigo.loja.controllers.PagamentoController.enviaEmailCompraProduto(PagamentoController.java:65)
    at br.com.casadocodigo.loja.controllers.PagamentoController.lambda$finalizar$0(PagamentoController.java:52)
    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:748)

Classe PagemtoController


@RequestMapping("/pagamento")
@Controller
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class PagamentoController {

    @Autowired
    private CarrinhoCompras carrinho;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private MailSender sender;

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

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

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

                // envia e-mail para o usuário
                enviaEmailCompraProduto(usuario);
                return new ModelAndView("redirect:/produtos");
            } catch (HttpClientErrorException e) {
                e.printStackTrace();
                model.addFlashAttribute("falha", "Valor maior que o permitido");
                return new ModelAndView("redirect:/produtos");
            }
        };
    }

    private void enviaEmailCompraProduto(Usuario usuario){
        SimpleMailMessage email = new SimpleMailMessage();
        email.setSubject("Compra finalizada com sucesso");
        email.setTo(usuario.getEmail());
        email.setText("Compra aprovada com sucesso no valor de "
                + carrinho.getTotal());
        email.setFrom("compras@casadocodigo.com.br");

        sender.send(email);
    }
}
1 resposta

Opa Priscilla, tudo bem?

Então, olhando assim meio por cima, me parece que o erro está quando você limpa o carrinho, porque depois, na hora de enviar o email, quando você tenta pegar os itens do carrinho, não existe nenhum, afinal você limpou.

Acho que altarando esta linha this.carrinho.limpa(); para debaixo do enviaEmailCompraProduto(usuario); this.carrinho.limpa(); return new ModelAndView("redirect:/produtos"); creio que resolveria, o carrinho deveria ser limpo depois de executar tudo.

Espero ter ajudado!