4
respostas

Mensagem de Erros não aparecendo na JSP

Olá, gostaria de pedir a ajuda de vocês para rodar o meu projeto Spring corretamente, especificamente na parte de validação de dados. Após seguir fielmente cada tópico do curso, me deparei com o seguinte problema, as mensagens do arquivo "ValidationMessages.properties" não estão sendo acessadas. Meu código está exatamente idêntico ao do curso. Todos os JARs estão na pasta LIB e o servidor que estou utilizando é o TomCat 7.

O que eu percebi foi que, no curso, vocês não nos orientaram quanto a configuração do arquivo XML do Spring, para que ele entenda aonde estmaos colocando as mensagens de erro. Acredito que seja isso o problema, vocês poderiam me ajudar ? Já procurei pela internet mas acabei encontrando outras formas de fazer a mesma coisa, gostaria de aprender com os recursos que vocês nos apresentaram no curso.

No aguardo e muito obrigado.

4 respostas

Meu código:

Arquivo Conta.java

package br.com.caelum.contas.modelo;

import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.Calendar;

public class Conta {

    private Long id;


    /* Com as anotations, podemos colocar as restrições para cada atributo da classe e, ainda,
    enviar mensagens para a tela do usuário para a ocorrência de erros. Para isso, devemos escrever essas
    mensagens no arquivo ValidationMessages.properties, para que o Spring entenda que essas mensagens são
    para erros de validação. */
    /* Aqui, diferente do Servlet recebendo os parametros, tratanto, e enviando de volta com o Foward para a tela,
    nós escrever apenas essa linha, tornando o código muito mais limpo.
    */


    @NotNull(message="{conta.formulario.descricao.obrigatoria}")
    @Size(min=5, message="{conta.formulario.descricao.tamanho}")
    private String descricao;

    private boolean paga;

    private double valor;

    @DateTimeFormat(pattern="dd/MM/yyyy")
    private Calendar dataPagamento;

    private TipoDaConta tipo;

    public Long getId() {
        return id;
    }

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

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public boolean isPaga() {
        return paga;
    }

    public void setPaga(boolean paga) {
        this.paga = paga;
    }

    public Calendar getDataPagamento() {
        return dataPagamento;
    }

    public void setDataPagamento(Calendar dataPagamento) {
        this.dataPagamento = dataPagamento;
    }

    public TipoDaConta getTipo() {
        return tipo;
    }

    public void setTipo(TipoDaConta tipo) {
        this.tipo = tipo;
    }

    public double getValor() {
        return valor;
    }    

    public void setValor(double valor) {
        this.valor = valor;
    }

}

Arquivo ContaController.java

package br.com.caelum.contas.controller;

import br.com.caelum.contas.dao.ContaDAO;
import br.com.caelum.contas.modelo.Conta;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;

import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;
import java.util.List;

@Controller
public class ContaController {

    @RequestMapping("/form")
    public String formulario() {
        return "conta/formulario";
    }

    @RequestMapping("/adicionaConta")
    public String adiciona(@Valid Conta conta, BindingResult result) {
        // se tiver erro, redirecione para o formulário. O BindingResult vai verificar se houve erro na validação.
         if(result.hasErrors()) {
            return "conta/formulario";
        }
        ContaDAO dao = new ContaDAO();
        dao.adiciona(conta);
        return "conta/conta-adicionada";
    }

Arquivo formulario.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Adcionar Contas</title>
</head>
<body>
    <h3> Adicionar Contas</h3>

    <form action="adicionaConta" method="post">
        Descrição: <textarea name="descricao" rows="5" cols="100"></textarea>
            <form:errors path="conta.descricao" />
        <br/>
        Valor:
        <input type="text" name="valor"/>
        <br>
        Tipo:
        <select name="tipo">
            <option value="ENTRADA"> Entrada</option>
            <option value="SAIDA"> Saida </option>
        </select>
        <br>

        <input type="submit" value="Adicionar"/>

    </form>
</body>
</html>

Arquivo ValidationMessages.properties

conta.formulario.sucesso=Conta adicionada com sucesso.
conta.formulario.descricao.obrigatoria=Descrição é obrigatória.
conta.formulario.descricao.tamanho=Descrição deve ter o mínimo de {min} caracteres.

Arquivo applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="br.com.caelum.contas" />
    <mvc:annotation-driven />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="br.com.caelum.contas.conversion.StringToEnumConverterFactory"/>
            </list>
        </property>
    </bean>
</beans>

Arquivo web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

Onde está o seu arquivo ValidationMessages.properties? Ele está no src?

Sim, esse arquivo esta na pasta src

Bom, no olhometro aqui eu não vi nada de errado. O fluxo funciona de boa, né? Da o erro de validação e volta pro formulário. Se quiser disponibilizar o código no github, posso olhar.