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

HTTP Status 404 - aula 7.2 validações - Erro ao montar a url após o redirecionamento do método gravar()

Olá pessoal. tudo bem ?

Alguem sabe de disse o que está de errado, após o redirect:produtos do método gravar do ProdutosController. Pois ao clicar no método a url fica errada: http://localhost:8081/casadocodigo/produtos/produtos, seguindo a aula não ocorreu com o instrutor.

package br.com.casadocodigo.loja.controllers;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.casadocodigo.daos.ProdutoDAO;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.TipoPreco;
import br.com.casadocodigo.loja.validation.ProdutoValidation;

@Controller
@RequestMapping("/produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDAO;

    @InitBinder
    public void initBinder(WebDataBinder binder){
        binder.addValidators(new ProdutoValidation());
    }

    @RequestMapping("/form")
    public ModelAndView form(){
        // mando um obj do model para o view
        ModelAndView modelAndView = new ModelAndView("produtos/form"); // indico a pagina
        modelAndView.addObject("tipos", TipoPreco.values());
        // mando o obj tipo preco para ser exibido pelo jsp

        return modelAndView;
    }

    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView gravar(@Valid Produto produto, BindingResult result, 
            RedirectAttributes redirectAttributes){

        if(result.hasErrors()){ // se aconteceu algum erro volta para o formulario
            return form();
        }

        produtoDAO.gravar(produto);

        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso !");

        return new ModelAndView("redirect:produtos"); // faço isso para nao ficar em cache e gravar novamente ao F5;
    }

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView listar(){
        List<Produto> produtos = produtoDAO.listar();
        ModelAndView modelAndView = new ModelAndView("produtos/lista");
        modelAndView.addObject("produtos", produtos);
        return modelAndView;
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Formulario de produtos</title>
</head>
<body>

    <form:form action="${s:mvcUrl('PC#gravar').build()}" method="post" commandName="produto">

        <div>
            <label>Titulo</label>
            <input type="text" name="titulo" > 
            <form:errors path="titulo"/>
        </div>

        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
            <form:errors path="descricao"/>
        </div>

        <div>
            <label>Páginas</label>
            <input type="text" name="paginas">
            <form:errors path="paginas"/>
        </div>

        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">

            <div>
                <label>${tipoPreco}</label>
                <input type="text" name="precos[${status.index}].valor">
                <input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco}">
            </div>        

        </c:forEach>


        <button type="submit">Cadastrar</button>
    </form:form>

</body>
</html>
3 respostas
solução!

Oi Cesar, no redirect coloca assim: redirect:/produtos.

Se vc não usa a barra na frente, ele faz redirect relativo ao endereço atual, e não a raiz do projeto.

Bom dia Alberto,

Muito obrigado, funcionou certinho !

Estava com este mesmo problema, mas adicionar a "/" fez tudo funcionar. Por que nos exemplos é mostrado ("redirect:produtos") sem a "/" e funciona?