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

Não valida corretamente

Boa noite pessoas!!!

Estava realizando os exercícios, cheguei até o final dessa aula e surgiu uma duvida. Talvez não esteja configurado de maneira correta o meu validation, mas se eu deixar os campos vazios tanto quanto descrição e titulo e preencher o campo pagina ele passa pela validação com ok e salva no banco.

O certo seria, se o titulo ou descrição ou pagina estiver em branco ser redirecionado ao meu form... não?

Segue meu controller

package br.com.casadocodigo.loja.controllers;

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
        private ProdutoDAO produtoDao;

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

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

        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(Produto produto, BindingResult result, RedirectAttributes redirect){
           if (result.hasErrors()) {
               //return form();
               return form();
           }

        produtoDao.gravar(produto);

        redirect.addFlashAttribute("sucesso","produto cadastrado com sucesso");

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

    @RequestMapping(method = RequestMethod.GET )
    public ModelAndView listar(){

        ModelAndView modelAndView = new ModelAndView("produtos/listar");
        modelAndView.addObject("produtos", produtoDao.listar());

        return modelAndView;
    }

}

A minha classe de validation

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) {
        // TODO Auto-generated method stub
        return Produto.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors erros) {
        // TODO Auto-generated method stub
        ValidationUtils.rejectIfEmpty(erros, "titulo", "field.requerid");
        ValidationUtils.rejectIfEmpty(erros, "descricao", "field.requerid");
        ValidationUtils.rejectIfEmpty(erros, "paginas", "field.requerid");

        Produto produto = (Produto) target;
        if (produto.getPaginas() <= 0) {
            erros.rejectValue("paginas", "field.requerid");
        }
    }

}
2 respostas
solução!

Olá Ciro, tudo bem?

Analisando seu código, me parece que está faltando uma anotação @Valid no método gravar, tente alterá-lo para:

public ModelAndView gravar (@Valid Produto produto, BindingResult result, RedirectAttributes redirect)

Abs

é verdade, coloquei a anotação @valid e a validação funcionou corretamente!!!

Obrigado Rafael!!