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

Aula 6 - Spring Validation Utils

Fiz minha classe ProdutoValidation igual ao da video aula, mas só está validando o numero de paginas, os campos titulo e descricao se eu deixar nulo passa normal.

package org.casadocodigo.loja.validation;

import org.casadocodigo.loja.models.Produto;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class ProdutoValidation implements Validator {

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

    @Override
    public void validate(Object target, Errors errors) {
    //Esses dois validation não estão funcionando
        ValidationUtils.rejectIfEmpty(errors, "titulo", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "descricao", "field.required");

        Produto p = (Produto)target;
        //Aqui OK se eu não enviar o numero de paginas
        if(p.getPaginas()<=0){
            errors.rejectValue("paginas", "field.required");
        }
    }

}
@Entity
public class Produto {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    private String titulo;
    private String descricao;
    private int paginas;
    @ElementCollection
    private List<Preco>precos;
//getters e setter omitidos
}
package org.casadocodigo.controllers;

import javax.validation.Valid;

import org.casadocodigo.loja.daos.ProdutoDAO;
import org.casadocodigo.loja.models.Produto;
import org.casadocodigo.loja.models.TipoPreco;
import org.casadocodigo.loja.validation.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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

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

    @Autowired
    private ProdutoDAO produtoDao;

    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(new ProdutoValidation());
    }

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

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

        produtoDao.gravar(produto);

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

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

//Outros metodos omitidos
2 respostas
solução!

Oi!

no seu ProdutosCOntroller no método initBinder faltou anotar o método com a annotation @InitBinder.

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

Obrigado, era exatamente isso. Olhei diversas vezes o código e deixei passar isso hahaha.