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

Aula 6 Spring MVC I - Servidor não valida os dados.

Olá, estou com um problema na aplicação exemplo do curso. Os dados não estão sendo validados pelo Spring.

Ele adiciona os valores em branco no Banco e ignora todas as validações.

Eu estou usando o Wildfly 10.0, então pode ser que isso tenha afetado algo. Se eu comentar toda a parte de validação, ele sequer da o erro 400, ele insere tudo branco e o preço 0.

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.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 ProdutoController {

    @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(@Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {

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

        redirectAttributes.addFlashAttribute("sucesso", "Livro cadastrado com sucesso!");

        produtoDao.gravar(produto);

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

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

        modelAndView.addObject("produtos", produtos);

        return modelAndView;
    }

}
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 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");
        }


    }

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

import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@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;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitulo() {
        return titulo;
    }
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getPaginas() {
        return paginas;
    }
    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    public List<Preco> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Preco> precos) {
        this.precos = precos;
    }

    @Override
    public String toString() {

        return "Título: " + titulo + " Descrição: " + descricao + " Páginas: " + paginas;
    }

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

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

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

@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    EntityManager manager;

    public void gravar(Produto produto) {
        manager.persist(produto);
    }

    public List<Produto> listar() {
        return manager.createQuery("select p from Produto p", Produto.class)
                .getResultList();
    }

}
5 respostas

Olhando eu não estou vendo o erro.. a não ser que os campos do formulário estejam sendo preenchidos com um monte de espaço em branco...

Não sendo esse o caso, vai precisar dar uma debugada... pode ser via debug mesmo, ou coloca uns prints para verificar os valores que estão vindo e tudo mais.

Eu coloquei um Sysout no método de validate da ProdutoValidation e ele simplemente não passou lá.

Eita, passou pelo metodo que adicona no seu controller? O projeto ta no github? Se tiver lá, manda o link que posso dar uma olhada.. se não tiver, sobe lá e manda o link.

Opa, tá na mão.

https://github.com/Scaetano/Aula6Spring

solução!

Bom, fica para o aprendizado.

Dei um clean no server, subi de novo e tudo funcionou.