1
resposta

Erro na URL montada a partir da utilização do mvcUrl

Essa dúvida já foi postada anteriormente, porém não obteve resposta. Então estou recriando. Estou utilizando o s:mvcUrl para fazer o action de algumas ações, mas a URL está vindo errada. A URL está vindo assim para remover um produto do carrinho:

<http://localhost:8080/casadocodigo/WEB-INF/views/carrinho/itens.jsp/carrinho/remover?produtoId=17&tipoPreco=COMBO>

E para finalizar a compra fica assim:

http://localhost:8080/casadocodigo/WEB-INF/views/carrinho/itens.jsp/pagamento/finalizar

O meu itens.jsp está assim:

<form:form action="${s:mvcUrl('CCC#remover').arg(0, item.produto.id).arg(1,item.tipoPreco).build() }" method="POST">
    <input type="image" src="${contextPath }resources/imagens/excluir.png" 
        alt="Excluir" title="Excluir" />
</form:form>

e assim:

<form:form action="${s:mvcUrl('PC#finalizar').build()}" method="post">
    <input type="submit" class="checkout" name="checkout" value="Finalizar compra" />
</form:form>

Meu PagamentoController.java está assim:

@Controller
@RequestMapping("/pagamento")
public class PagamentoController {
    @Autowired
    public  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";
            String attributeName = null;
            Object attributeValue = null;
            try {
                String response = restTemplate.postForObject(uri, new DadosPagamento(carrinho.getTotal()), String.class);
                System.out.println(response);
                enviaEmailCompraProduto(usuario);
                attributeName = "sucesso";
                attributeValue = response;
            } catch (HttpClientErrorException e) {
                e.printStackTrace();
                System.out.println(e.getMessage());
                attributeName = "falha";
                attributeValue = "Valor maior que o permitido.";
            }
            model.addFlashAttribute(attributeName, attributeValue);
            ModelAndView modelAndView = new ModelAndView("redirect:/produtos");
            return modelAndView;
        };
    }

    private void enviaEmailCompraProduto(Usuario usuario) {
        try {
            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);
        } catch (Exception e) {
            System.out.println("Erro no envio do email: " + e.getMessage());
        }
    }
}

Se eu uso a URL direto, ao invés de suar o mvcUrl, ai funciona a chamada. Alguma dica?

1 resposta

Olá Johnata, tudo bem? Peço desculpas pela demora no retorno! Seu código postado aqui me parece está correto, então só posso ti indicar algum problema ou configuração vendo o restante do seu código, então você poderia disponibilizar esse projeto no GitHub e disponibilizar também o link aqui para que eu possa verificar e tentar ajudar!

Fico aguardando retorno!