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

HTTP Status 400 – Bad Request

Toda vez que aperto para enviar o formulário com nenhum dado está dando esse erro. Segue os códigos fontes:

ProdutoValidacao

package br.com.casadocodigo.loja.validadores;

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

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

public class ProdutoValidacao implements Validator{

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

    @Override
    public void validate(Object target, Errors e) {
        Produto p = (Produto) target;
        ValidationUtils.rejectIfEmpty(e, "titulo", "field.required");
        ValidationUtils.rejectIfEmpty(e, "descricao", "field.required");
        if(p.getPaginas() <= 0) {
            e.rejectValue("paginas", "field.required");
        }

    }

}

ProdutosController

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.TipoPreco;
import br.com.casadocodigo.loja.validadores.ProdutoValidacao;

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

    @Autowired
    private ProdutoDAO dao;

    @InitBinder
    public void InitBinder(WebDataBinder wdb) {
        wdb.addValidators(new ProdutoValidacao());
    }

    @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, RedirectAttributes ra, BindingResult br){
        if(br.hasErrors()) {
            return form();
        } else {
            dao.gravar(produto);
            ModelAndView mv = new ModelAndView("redirect:produtos");
            ra.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
            return mv;
        }
    }

    @RequestMapping( method = RequestMethod.GET)
    public ModelAndView listar() {
        List<Produto> lista = dao.listar();
        ModelAndView mv = new ModelAndView("produtos/lista");
        mv.addObject("produtos", lista);
        return mv;
    }
}
1 resposta
solução!

Olá Guilherme, tudo bem com você?

Quando estamos fazendo a validação, o Spring considera que o próximo atributo do método é o resultado dessa validação, então precisamos trocar o:

 public ModelAndView gravar(@Valid Produto produto, RedirectAttributes ra, BindingResult br){

para:

    public ModelAndView gravar(@Valid Produto produto, BindingResult br, RedirectAttributes ra,){

Acredito que só isso já deve resolver seu problema :)

Abraços e Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software