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

aulas 6 e 7 - Validações

olá, por favor

Poderiam me ajudar por favor?

implementei em meu projeto pessoal as aulas sobre validações, porém, as mensagens não estão aparecendo no navegador, comprovando assim que meu projeto não está validando.

quando efetuo o cadastro a pagina é redirecionada normalmente, quando digito apenas um campo para cadastrar, volta para a pagina de cadastro, sem dar nenhuma exception.

em meu projeto, está na mesma situação: aluno, professor e instituição.

AlunoValidation

package br.com.projeto.cuidandodaatencao.validation;

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

import br.com.projeto.cuidandodaatencao.model.Aluno;

public class AlunoValidation implements Validator{

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

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "senha", "field.required" );
        ValidationUtils.rejectIfEmpty(errors, "nome", "field.required" );
        ValidationUtils.rejectIfEmpty(errors, "matricula", "field.required" );
        ValidationUtils.rejectIfEmpty(errors, "idade", "field.required" );
        ValidationUtils.rejectIfEmpty(errors, "sexo", "field.required" );
        ValidationUtils.rejectIfEmpty(errors, "serie", "field.required" );

       }

    }

CadastroAluno.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ 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>Cuidando da Atenção</title>
</head>
<body>
    <form:form action="${s:mvcUrl('AC#gravar').build() }" method="POST" commandName="aluno">
           <div>
            <label>Matricula</label>            
            <input type="text" name="matricula">
            <form:errors classpath="matricula" />
        </div>
        <div>
            <label>Nome do Aluno</label>            
            <input type="text" name="nome">
            <form:errors classpath="nome" />
        </div>

        <div>
            <label>senha</label>            
            <input type="text" name="senha">
            <form:errors classpath="senha" />
        </div>

         <div>
            <label>idade</label>            
            <input type="text" name="idade">
            <form:errors classpath="idade" />
        </div>

         <div>
            <label>serie atual</label>            
            <input type="text" name="serie">
            <form:errors classpath="serie" />
        </div>

         <div>
            <label>sexo</label>            
            <input type="text" name="sexo">
            <form:errors classpath="sexo" />
        </div>      
        <button type="submit">
            Cadastrar
        </button>
    </form:form>
</body>
</html>

Obrigada!!

10 respostas

Oi Lilian,

Acredito que tenha faltado registrar o seu Validator dentro do Controller que você quer utilizar.

Para registrar, dentro do Controller você precisa criar um método e anotá-lo com @InitBinder e receber um objeto do tipo WebDataBinder.

Algo como:

@InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(INSTANCIA_DO_SEU_VALIDADOR_AQUI);
    }

Pronto, aí o Spring vai rodar este validador quando você fizer submit no form.

Abraço!

Olá Joviane,

Eu acrescentei o código do @InitBinder, porém, continua dando o mesmo problema que relatei acima.

obrigada pela ajuda.


package br.com.projeto.cuidandodaatencao.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.projeto.cuidandodaatencao.dao.AlunoDAO;
import br.com.projeto.cuidandodaatencao.model.Aluno;
import br.com.projeto.cuidandodaatencao.validation.AlunoValidation;

@RequestMapping("/alunos")
@Controller
public class AlunoController {

    @Autowired /* spring ejetar o DAO */
    private AlunoDAO alunoDAO; 

    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.addValidators(new AlunoValidation());

    }

    @RequestMapping("CadastroAluno")    
     public ModelAndView form(Aluno aluno){
            ModelAndView modelAndView = new ModelAndView("projeto/CadastroAluno");

        return modelAndView;
    }

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

        if (result.hasErrors()){
             return form(aluno);
        }
        alunoDAO.gravar(aluno);

        redirectAttributes.addFlashAttribute("sucesso", "Aluno Cadastrado");

        return new ModelAndView("redirect:alunos");

        }

       @RequestMapping(method=RequestMethod.GET)
        public ModelAndView listar() {
           List<Aluno> alunos = alunoDAO.listar();
           ModelAndView modelAndView = new ModelAndView("projeto/ListaDeAlunos");
          modelAndView.addObject("alunos", alunos);

            return modelAndView;
        }


}

Lilian,

Troca de:

<form:errors classpath="matricula" />

para:

<form:errors path="matricula" />

olá Joviane,

eu tinha colocado Classpath porque estava dando o erro abaixo, assim que eu alterei conforme me pediu, o erro voltou a aparecer.

obrigada pela ajuda.

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/views/projeto/CadastroAluno.jsp at line 27

type Exception report

message An exception occurred processing JSP page /WEB-INF/views/projeto/CadastroAluno.jsp at line 27

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/projeto/CadastroAluno.jsp at line 27

24:         <div>
25:             <label>senha</label>            
26:             <input type="text" name="senha">
27:             <form:errors path="senha" />
28:         </div>
29: 
30:          <div>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:575)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

org.springframework.context.NoSuchMessageException: No message found under code 'field.required' for locale 'pt_BR'.
    org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:186)
    org.springframework.context.support.AbstractApplicationContext.getMessage(AbstractApplicationContext.java:1127)
    org.springframework.web.servlet.support.RequestContext.getMessage(RequestContext.java:707)
    org.springframework.web.servlet.support.BindStatus.initErrorMessages(BindStatus.java:181)
    org.springframework.web.servlet.support.BindStatus.getErrorMessages(BindStatus.java:277)
    org.springframework.web.servlet.tags.form.ErrorsTag.exposeAttributes(ErrorsTag.java:174)
    org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:49)
    org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
    org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
    org.apache.jsp.WEB_002dINF.views.projeto.CadastroAluno_jsp._jspService(CadastroAluno_jsp.java:187)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:172)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Oi Lilian,

Agora está dando o erro:

org.springframework.context.NoSuchMessageException: No message found under code 'field.required' for locale 'pt_BR'.

Este erro ocorre pois está faltando criar o arquivo messages.properties e colocar as chaves das mensagens lá dentro.

Por exemplo:

field.required = Campo obrigatório

Abraço!

Olá Joviane,

eu já tinha efetuado o arquivo message.properties com as mensagens abaixo. Porém, continua dando o mesmo erro.

obrigada pela ajuda.

field.required = Campo obrigatório
field.required.aluno.matricula = a matricula é obrigatório
field.required.aluno.nome = O campo nome é obrigatorio
field.required.aluno.sexo = O campo sexo é obrigatorio
typeMismatch = o tipo do dado é inválido

Lilian,

Confere pra mim algumas coisas?

  • Se seu arquivo está como messages.properties ou como message.properties.

  • Se você criou o @Bean que fabrica o MessageSource para o Spring achar as mensagens:

public MessageSource messageSource() {
     ReloadableResourceBundleMessageSource bundle = new ReloadableResourceBundleMessageSource();
     bundle.setBasename("/WEB-INF/messages");
     bundle.setDefaultEncoding("UTF-8");
     bundle.setCacheSeconds(1);
     return bundle;
 }
  • Se o arquivo está realmente no diretório /WEB-INF

  • Se você tem mais do que um arquivo messages.properties. Se você tiver um arquivo messages_pt_BR.properties por exemplo, você precisa colocar todas as mensagens nele também.

Qualquer coisa me avisa.

Abraço!

olá Joviane,

meu arquivo está como message.properties Criei @Bean no AppWebConfiguration meu arquivo está no diretório /WEB - INF não criei e nem localizei o arquivo messages_pt_BR.properties

obrigada pela ajuda =)

solução!

Lilian,

Renomeia o arquivo para messages.properties. Tem que ser exatamente o nome que está no @Bean.

Abraço!

Muito obrigada!!! era isso mesmo!! alterei o nome do arquivo e deu certo!! =)

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