4
respostas

Mensagem de validação no form não aparece

Estou fazendo os exercícios da aula 7, criei o arquivo com as mensagens , o método messageSource e adicionei a tag form no jsp e ainda não funciona e não da erro, simplesmente mostra o form sem as mensagens, parece que o sistema não entende que estou tratando para mostrar alerta nos campos, o que pode ser ?

Esses são os código que tenho:

<%@ 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" %>

<!-- ... restante do código ... -->
<form:form action= "${s:mvcUrl('PC#gravar').build()}" method="post">
        <div>

            <label>Titulo</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="number" name="paginas">
            <form:errors path="produto.paginas" />
        </div>

        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
            <div>
                <label>${tipoPreco}</label>
                <input type="text" name="precos[${status.index}].valor" >
                <input type="hidden" name="precos[${status.index}].tipo" value="${tipoPreco}" >
            </div>
        </c:forEach>

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

messages.properties

field.required = Campo obrigatório
field.required.produto.titulo = O titulo é obrigatório
field.required.produto.paginas = O campo páginas é obrigatorio
field.required.produto.descricao = O campo descrição é obrigatorio
typeMismatch = o tipo do dado é inválido

messageSource

@Bean
    public MessageSource messageSource(){
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();

        messageSource.setBasename("/WEB-INF/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);

        return messageSource;
    }

ProdutosController

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

        return modelView;
    }

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

        if(result.hasErrors()){
            return form();
        }

        produtoDAO.gravar(produto);

        ModelAndView modelAndView = new ModelAndView("redirect:produtos");
        redirectAttributes.addFlashAttribute("sucesso", "Livro cadastrado com sucesso!");

        return modelAndView;
    }

form.jsp

4 respostas

Oi André, só olhando o código não descobri ainda... Dentro do if que verifica os erros do formulário, usa o bindingResult e tenta imprimir a lista de erros. Se tiver tido erro mesmo, ele vai mostrar a lista e as chaves inclusive.

Imprimi os erros e apareceu o seguinte:

org.springframework.validation.BeanPropertyBindingResult: 4 errors
Field error in object 'produto' on field 'paginas': rejected value []; codes [typeMismatch.produto.paginas,typeMismatch.paginas,typeMismatch.int,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [produto.paginas,paginas]; arguments []; default message [paginas]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'paginas'; nested exception is java.lang.NumberFormatException: For input string: ""]
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]
Field error in object 'produto' on field 'paginas': rejected value [0]; codes [field.required.produto.paginas,field.required.paginas,field.required.int,field.required]; arguments []; default message [null]

Não deveria aparecer o texto das mensagens nessa lista ?

Oi André, o engraçado é que eu acho que deveria :). Olhando assim não estou conseguindo desvendar... pode compartilhar seu projeto no github? tento olhar até amanhã.

Segue o link: https://github.com/AndreKrebs/casadocodigo

Valeu.