Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Não mostra mensagens de validação

Eu fiz o código exatamente igual ao da aula porém as mensagens de validação não aparecem na view (a validação é feita, não deixando avançar para a lista de produtos).

AppWebConfiguration:

@Bean
    public MessageSource messageResource(){
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);
        return messageSource;
    }

ProdutosController:

package br.com.casadocodigo.loja.controller;

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.loja.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
    ProdutoDAO produtoDao;

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

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

    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView salvar(@Valid Produto produto, BindingResult bindingResult, RedirectAttributes redirectAttributes){
        if(bindingResult.hasErrors()){
            return new ModelAndView("redirect:produtos/form");
        }
        produtoDao.gravar(produto);
        redirectAttributes.addFlashAttribute("mensagem", "Produto salvo com sucesso!");
        return new ModelAndView("redirect:produtos");
    }

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

}

ProdutoValidation:

package br.com.casadocodigo.loja.validation;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import br.com.casadocodigo.loja.models.Produto;

public class ProdutoValidation implements Validator{

    @Override
    public boolean supports(Class<?> clazz) {
        return Produto.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "descricao", "field.required");

        Produto produto = (Produto) obj;

        if(produto.getPaginas() <= 0){
            errors.rejectValue("paginas", "field.required");
        }
    }

}

Formulário:

<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>Livros de java, Android, Iphone, PHP, Ruby e muito mais - Casa do código</title>
</head>
<body>
    <form:form action="${s:mvcUrl('PC#salvar').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="tipo" varStatus="status">
            <div>
                <label>${tipo}</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>
1 resposta
solução!

Achei o problema... O problema era o redirect do ModelAndView hahah

if(bindingResult.hasErrors()){
            return new ModelAndView("redirect:produtos/form");
        }