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

validação funciona, porem mensagens não são exibidas

Boa noite,

estou fazendo a validação do spring e estava funcionando, até passar a usar a taglib

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

com isso a validação é feita, porem as mensagens não são exibidas, não entendi o pq.

segue o codigo do controller:

package br.com.alura.casadocodigo.controller;

//imports

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

    @Autowired
    private ProdutoDao produtoDao;

    @InitBinder
    private void initBin(WebDataBinder webDataBinder) {
        webDataBinder.addValidators(new ProdutoValidator());
    }

    @RequestMapping(value="/cadastro", method=RequestMethod.POST)
    public ModelAndView cadastro(@Valid Produto p, BindingResult bindingResult, RedirectAttributes redirectAttributes) {

        System.out.println("");System.out.println("");System.out.println("");

        System.out.println("Produto-> "+p);
        System.out.println("bindingResult.hasErrors() = "+bindingResult.hasErrors());

        System.out.println("");System.out.println("");System.out.println("");

        if(bindingResult.hasErrors()) {
            return formCadastro();
        }

        produtoDao.gravar(p);
        redirectAttributes.addFlashAttribute("msgRetorno", "Produto Adicionado com sucesso!!!");
        ModelAndView modelAndView = new ModelAndView("redirect:/produtos");
        return modelAndView;
    }

    @RequestMapping("/novo")
    public ModelAndView formCadastro() {
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("listaPrecos", TipoPreco.values());
        return modelAndView;
    }

    @RequestMapping(method=RequestMethod.GET)
    public ModelAndView listaProdutos() {
        ModelAndView modelAndView = new ModelAndView("produtos/lista");
        modelAndView.addObject("produtos", produtoDao.listarTodos());
        return modelAndView;
    }

}

validator:

package br.com.alura.casadocodigo.validators;

//imports

public class ProdutoValidator implements Validator{

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

    @Override
    public void validate(Object target, Errors errors) {
        Produto p = (Produto) target;

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

        if(p.getPaginas() != null && p.getPaginas() <= 0) {
            errors.rejectValue("paginas", "field.required");
        }
    }



}

jsp: OBS-JPS: no "<form.erros>" antes eu estava colocando em path "titulo", mas como não funcionou eu mudei pra "produto.titulo" e ver se funcionava, mas não adiantou.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <form:form action="${s:mvcUrl('PC#cadastro').build()}" method="POST">
        <div>
            <label>Título</label>
            <input type="text" name="titulo" />
            <form:errors path="produto.titulo" />
        </div>

        <div>
            <label>Descrição</label>
            <textarea rows="10" cols="20" name="descricao"></textarea>
            <form:errors path="produto.descricao" />
        </div>

        <div>
            <label>Páginas</label>
            <input type="text" name="paginas" />
            <form:errors path="produto.paginas" />
        </div>
        <c:forEach items="${listaPrecos}" var="preco" varStatus="status">
            <div>
                <label>preco(${preco})</label>
                <input type="text" name="precos[${status.index}].valor" />
                <input type="hidden" name="precos[${status.index}].tipoPreco" value='${preco}' />
            </div>
        </c:forEach>


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

</body>
</html>
5 respostas

Esses Syouts exibem a mensagem de erro direitinho?

O "+bindingResult.hasErrors())" retorna true ou false quando tem erros, não as mensagens.

Mas sim ele retorna true.

Olá Allan!

Seu initBin está privado:

@InitBinder
    private void initBin(WebDataBinder webDataBinder) {
        webDataBinder.addValidators(new ProdutoValidator());
    }

Tenta deixar ele publico pra ver se funciona.

Aguardo seu retorno!

boa noite, cheguei em casa a pouco tempo, alterei pra public mas não adiantou em nada.

eu olhei os erros que vem no metodo "getAllErrors" pelo debug e o retorno é o seguinte

[Field error in object 'produto' on field 'titulo': rejected value []; codes [field.required.produto.titulo,field.required.titulo,field.required.java.lang.String,field.required]; arguments []; default message [null], Field error in object 'produto' on field 'descricao': rejected value []; codes [field.required.produto.descricao,field.required.descricao,field.required.java.lang.String,field.required]; arguments []; default message [null]]

mas na jsp não exibe nada

solução!

descobri o problema.

na jsp troquei de:

modelName="produto"

para

modelAttribute="produto"

e funcionou perfeitamente

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