3
respostas

Erro ao efetuar pagamento - Problema com RestTemplate

Prezados,

assim como ocorreu no vídeo da aula, ao tentar finalizar a compra de um produto, em vez de redirecionar para a página indicada, ocorre um erro 500.

Apesar de o problema ter sido ignorado durante a aula, estou tentando resolvê-lo, porém ainda não obtive sucesso.

Alguém poderia me ajudar?

Segue código da action do controller:

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

    @Autowired
    private CarrinhoCompras carrinhoCompras;

    @Autowired
    private ProdutoRepository produtoRepository;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/finalizar", method = RequestMethod.POST)
    public Callable<ModelAndView> finalizar(RedirectAttributes redirectAttributes) {
        final String URL = "http://book-payment.herokuapp.com/payment";

        return () -> {
            try {
                String result = restTemplate.postForObject(URL, new DadosPagamento(carrinhoCompras.getTotal()), String.class);
                System.out.println(result);

                redirectAttributes.addFlashAttribute("message", result);

            } catch (HttpClientErrorException e) {
                redirectAttributes.addFlashAttribute("error", "Valor maior que o permitido");
                e.printStackTrace();
            }

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

Pelo que pude ver, o problema aparentemente está na linha:

                String result = restTemplate.postForObject(URL, new DadosPagamento(carrinhoCompras.getTotal()), String.class);

Porém, testando através do postman, enviando o seguinte JSON via POST o resultado é 200:

{
    "value": 49.9
}

Analisando a exception do servidor, não consegui entender detalhes do problema:

18-Jul-2017 13:03:46.763 GRAVE [http-nio-8080-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [/spring-mvc] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error] with root cause
 org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:66)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:380)
    at br.com.jmsstudio.controller.PagamentoController.lambda$finalizar$0(PagamentoController.java:39)
    at org.springframework.web.context.request.async.WebAsyncManager$4.run(WebAsyncManager.java:316)
    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)

Mais alguém teve problema parecido?

Caso sejam necessários mais detalhes, segue link do projeto no github: https://github.com/jmsstudio/aprendendo-spring-mvc

3 respostas

Oi Jefferson, na exception do rest template existe um método que você pode pegar o corpo da resposta... Consegue imprimir e dar uma olhada?

Alberto, estranhamente me deu um html com um erro.

Seguem os headers:

{Server=[Cowboy], Date=[Tue, 18 Jul 2017 18:54:17 GMT], Connection=[keep-alive], Content-Type=[text/html; charset=utf-8], Content-Length=[1941], Via=[1.1 vegur]}

E o responseBody:

<!DOCTYPE html>
<html>
    <head>
        <title>Error</title>
        <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAlFJREFUeNqUU8tOFEEUPVVdNV3dPe8xYRBnjGhmBgKjKzCIiQvBoIaNbly5Z+PSv3Aj7DSiP2B0rwkLGVdGgxITSCRIJGSMEQWZR3eVt5sEFBgTb/dN1yvnnHtPNTPG4PqdHgCMXnPRSZrpSuH8vUJu4DE4rYHDGAZDX62BZttHqTiIayM3gGiXQsgYLEvATaqxU+dy1U13YXapXptpNHY8iwn8KyIAzm1KBdtRZWErpI5lEWTXp5Z/vHpZ3/wyKKwYGGOdAYwR0EZwoezTYApBEIObyELl/aE1/83cp40Pt5mxqCKrE4Ck+mVWKKcI5tA8BLEhRBKJLjez6a7MLq7XZtp+yyOawwCBtkiBVZDKzRk4NN7NQBMYPHiZDFhXY+p9ff7F961vVcnl4R5I2ykJ5XFN7Ab7Gc61VoipNBKF+PDyztu5lfrSLT/wIwCxq0CAGtXHZTzqR2jtwQiXONma6hHpj9sLT7YaPxfTXuZdBGA02Wi7FS48YiTfj+i2NhqtdhP5RC8mh2/Op7y0v6eAcWVLFT8D7kWX5S9mepp+C450MV6aWL1cGnvkxbwHtLW2B9AOkLeUd9KEDuh9fl/7CEj7YH5g+3r/lWfF9In7tPz6T4IIwBJOr1SJyIGQMZQbsh5P9uBq5VJtqHh2mo49pdw5WFoEwKWqWHacaWOjQXWGcifKo6vj5RGS6zykI587XeUIQDqJSmAp+lE4qt19W5P9o8+Lma5DcjsC8JiT607lMVkdqQ0Vyh3lHhmh52tfNy78ajXv0rgYzv8nfwswANuk+7sD/Q0aAAAAAElFTkSuQmCC">
        <style>
            html, body, pre {
                margin: 0;
                padding: 0;
                font-family: Monaco, 'Lucida Console', monospace;
                background: #ECECEC;
            }
            h1 {
                margin: 0;
                background: #A31012;
                padding: 20px 45px;
                color: #fff;
                text-shadow: 1px 1px 1px rgba(0,0,0,.3);
                border-bottom: 1px solid #690000;
                font-size: 28px;
            }
            p#detail {
                margin: 0;
                padding: 15px 45px;
                background: #F5A0A0;
                border-top: 4px solid #D36D6D;
                color: #730000;
                text-shadow: 1px 1px 1px rgba(255,255,255,.3);
                font-size: 14px;
                border-bottom: 1px solid #BA7A7A;
            }
        </style>
    </head>
    <body>
        <h1>Oops, an error occured</h1>

        <p id="detail">
            This exception has been logged with id <strong>74l007f3m</strong>.
        </p>

    </body>
</html>

Ta com cara de ser alguma coisa lá no servidor...

Olá Jefferson.

Também estava com o mesmo problema e o resolvi da seguinte forma:

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

                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                HttpEntity<String> entity = new HttpEntity<String>("{\"value\": " + carrinho.getTotal() + "}", headers);
                String response = restTemplate.postForObject(uri, entity, String.class);

                enviaEmailCompraProduto(usuario);
                model.addFlashAttribute("sucesso", "Pagamento realizado com sucesso!");
                System.out.println(response);
            } catch (HttpServerErrorException e) {
                e.printStackTrace();
                model.addFlashAttribute("falha", "Valor maior que o permitido!");
            }
            return new ModelAndView("redirect:/produtos");
        };
    }

Porém na sequencia ocorre um NullPointerException ao enviar o e-mail de confirmação da compra para o usuário pois não temos um usuário autenticado neste momento. O instrutor no vídeo colocou o e-mail dele e não o e-mail do usuário autenticado e por isso não deve ter visto este erro.

Espero que ajude.

At.

Winston

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