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

Encaminhando para página errada após salvar o produto e colocar as validações

Olá pessoal, fiz a aula 7 agora (mais validações) e após alterar meu ProdutoController e colocando a "/" no request, quando eu valido esta tudo ok, porém no momento de cadastrar o produto ele esta me enviando para uma url inexistente (http://localhost:8080/casadocodigoSpring/produtos/produtos) segue meu controller e meu jsp

package br.com.agilles.casadocodigoSpring.loja.controller;

import br.com.agilles.casadocodigoSpring.loja.dao.ProdutoDao;
import br.com.agilles.casadocodigoSpring.loja.models.Produto;
import br.com.agilles.casadocodigoSpring.loja.models.TipoPreco;
import br.com.agilles.casadocodigoSpring.loja.validators.ProdutoValidation;
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 javax.validation.Valid;
import java.util.List;

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

    @Autowired
    private ProdutoDao produtoDao;

    /**
     * Observação: O Binder, por assim dizer, é o responsável por conectar duas coisas. Por exemplo, os dados do formulário com o objeto da classe Produto
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.addValidators(new ProdutoValidation());
    }

    /**
     * @return
     */
    @RequestMapping("/form")
    public ModelAndView form() {
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());

        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView grava(@Valid Produto produto, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
        if (bindingResult.hasErrors()) {
            return form();
        }
        produtoDao.gravar(produto);
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso");

        return new ModelAndView("redirect:produtos");

    }

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

    }

}

meu arquivo jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@taglib prefix="s" uri="http://www.springframework.org/tags" %>

<!DOCTYPE html>
<html>
<head>
    <title>Livro de Java - Android - Iphone e muito mais</title>
</head>
<body>
    <form:form action="${s:mvcUrl('PC#grava').build()}" method="post" commandName="produto">
    <div>
        <label>Título</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

Olá Jilles. Pelo que entendi você está redirecionando para a mesma página. O que não é necessário se você quiser exibir apenas a mensagem de sucesso para o caso.

return new ModelAndView("redirect:produtos");

Outra coisa, geralmente a especificação da URL fica no bean e não no controler.

@RequestMapping("/produtos")

Poderia mostrar a classe "ModelAndView.java" e do seu Bean?

Opa Jamile, tudo bem? Então minha página contendo a lista dos produtos cadastrados está mapeado como

"/produtos"

já a classe Model And View, ela é do spring, nao está nos meus models, uso apenas para jogar um objeto na pagina, conforme esta sendo ensinado no curso. Com relação ao requestMapping, estou usando tb como no curso hehe. ele deveria me redirecionar apenas para a url:

http://localhost:8080/casadocodigoSpring/produtos/

mas ao inves disso ele retorna

http://localhost:8080/casadocodigoSpring/produtos/produtos
solução!

resolvi, no meu return tive que mapear com a "/" tb

return new ModelAndView("redirect:produtos");

ficando assim

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