1
resposta

Nao está ocorrendo a validação, está aceitando campos vazios em descricao e titulo (aceita tambem o valor 0 em páginas)

meu codigo:

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.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.models.Produto;
import br.com.casadocodigo.loja.models.Tipo;
import br.com.casadocodigo.loja.validators.ProdutoValidator;

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

    @Autowired   //nao precisamos criar manualmente o objeto ProdutoDAO, o Spring faz isso.
    private ProdutoDAO dao;

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


    @RequestMapping("/form")             
    public ModelAndView produtosForm(){
         ModelAndView mav = new ModelAndView("produtos/form");
        mav.addObject("tipos", Tipo.values());
         System.out.println("Criando formulario");
        return mav;
    }

     @RequestMapping(method=RequestMethod.POST)             
        public ModelAndView gravar(@Valid Produto produto, BindingResult result, RedirectAttributes redattrs){            
               System.out.println("Adicionando produto");
               if(result.hasErrors()){
                return produtosForm();
            }
             dao.gravar(produto);
             ModelAndView mav = new ModelAndView("redirect:produtos"); //redireciona, ou seja, faz um novo request para "/produtos" com o metodo get
             //O REDIRECT É IMPORTANTE PARA QUE NAO CONTINUE NA REQUISIÇÃO POST, CORRENDO O RISCO DO F5 E REENVIAR DADOS PARA O BANCO.
             redattrs.addFlashAttribute("sucesso", "Produto adicionado com sucesso"); //propaga esse objeto para a nova requisiçao que é feita pelo redirecionamento.
               System.out.println(produto);
            return mav;
        }

     @RequestMapping(method=RequestMethod.GET)             
        public ModelAndView listar(Produto produto){    
             ModelAndView mav = new ModelAndView("produtos/lista");
               System.out.println("Listando todos produtos");
             List <Produto> lista = dao.listar();
             mav.addObject("lista", lista);
            return mav;
        }



}
package br.com.casadocodigo.loja.validators;

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

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

public class ProdutoValidator implements Validator {


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

        } //Verifica se o objeto recebido para validação éda classe Produto.

        @Override
        public void validate(Object target, Errors errors) {

            ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");
            ValidationUtils.rejectIfEmpty(errors, "descricao", "field.required");

            Produto produto = (Produto) target;

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


}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    

<!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=ISO-8859-1">
<title>Livro de Java, Android, Iphone e outros</title>
</head>
<body>

    <form action="/casadocodigo/produtos" method="POST">
        <div>
            <label>Titulo: </label> <input type="text" name="titulo">
        </div>
        <div>
            <label>Descrição: </label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
        </div>
        <div>
            <label>Páginas: </label> 
            <input type="text" name="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="${tipo }">

        </div>
        </c:forEach>

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

    </form>



</body>
</html>
1 resposta

Oi Eduardo, tudo bem?

Ele está gravando ou só está voltando para a tela sem as mensgens de erro? Se for o segundo caso, é só esperar um pouco mais que as tags de erro ainda vão ser apresentadas.

Se estiver sendo gravado, uma outra opção é que o campo esteja indo com vários espaços e aí, nesse caso, a validação também não vai pegar. Poderia verificar?