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

Problemas com mensagens de validação

Estou tentando criar um projeto similiar para aplicar as atividades desse curso, porém estou tendo problemas em fazer as mensagens de erro aparecerem na página de formulário. Segue aqui os códigos

criaContaFrom.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>MyBank - Nova conta</title>
</head>
<body>
    <h1>Criar uma nova conta</h1>
    <div>${erro}</div>
    <form:form action="${spring:mvcUrl('CC#gravar').build()}" method="post" modelAttribute="conta">
        <div>
            <label>Nome do titular</label><br> <input type="text"
                name="titular">
            <form:errors path="titular" />
        </div>
        <div>
            <label>CPF</label><br> <input type="text" name="cpf">
            <form:errors path="cpf" />
        </div>
        <label>Tipo de conta</label>
        <form:errors path="categoria" />
        <br>
        <input type="radio" name="categoria" value="normal"> Normal <br>
        <input type="radio" name="categoria" value="especial"> Especial<br>
        <input type="radio" name="categoria" value="personified"> Personified<br>
        <div>
            <label>Senha</label>
            <form:errors path="senha" />
            <br> <input type="password" name="senha">
        </div>
        <div>
            <label>Confirmar a senha</label><br> <input type="password"
                name="senhaConfirma">
        </div>
        <button type="submit">Criar conta</button>
    </form:form>
</body>
</html>

ContaController.java

package br.com.guiga.MyBank.controllers;
//Imports ocultados
@Controller
public class ContaController {
    @Autowired
    private ContaDAO cdao;
    @InitBinder
    public void initBinder(WebDataBinder webDataBinder) {
        webDataBinder.addValidators(new ValidadorDadosConta());
    }
    @RequestMapping("/criar-conta")
    public String form() {
        return"criaContaForm";
    }
    @RequestMapping("/lista-contas")
    public ModelAndView listar() {
        List<Conta> lista = cdao.listar();
        ModelAndView mv = new ModelAndView("/lista");
        mv.addObject("contas", lista);
        return mv;
    }
    @RequestMapping("/verificador")
    public ModelAndView gravar(String senha, String senhaConfirma, @Valid Conta c, BindingResult br, RedirectAttributes ra) {
        c.setSenha(senha);
        c.setSenhaConfirma(senhaConfirma);
        if (br.hasErrors()) {
            ra.addFlashAttribute("erro", "Informações incorretas, por favor verifique e tente novamente!");
            return new ModelAndView("redirect:criar-conta");
        } else {
            c.setSaldo(0.0);
            cdao.gravar(c);
            return new ModelAndView("sucesso");
        }
    }
}

ValidadorDadosConta.java

package br.com.guiga.MyBank.valid;
//Imports ocultados
public class ValidadorDadosConta implements Validator{
    @Override
    public boolean supports(Class<?> clazz) {
        return Conta.class.isAssignableFrom(clazz);
    }
    @Override
    public void validate(Object target, Errors errors) {
        Conta c = (Conta) target;
        System.out.println("Validando...");
        ValidationUtils.rejectIfEmpty(errors, "titular", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "cpf", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "senha", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "categoria", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "senhaConfirma", "field.required");
        if(c.getCpf().length() != 11) {
            System.out.println("Foi o CPF");
            errors.rejectValue("cpf", "field.incorrect");
        }
        if(!c.getSenha().equals(c.getSenhaConfirma())) {
            System.out.println("Foi a senha!");
            errors.rejectValue("senhaConfirma", "field.incorrect");
        }
    }
}

AppWebConfig.java

package br.com.guiga.MyBank.configs;
//Imports ocultados
@EnableWebMvc
@ComponentScan(basePackageClasses = { HomeController.class, ContaController.class, ContaDAO.class })
public class AppWebConfig {
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver() {
        InternalResourceViewResolver resolvedor = new InternalResourceViewResolver();
        resolvedor.setPrefix("/WEB-INF/views/");
        resolvedor.setSuffix(".jsp");
        return resolvedor;
    }
    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("/WEB-INF/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(1);
        return messageSource;
    }
}
2 respostas

Esqueci de mandar o message.properties

field.required = Campo obrigatório
field.required.conta.titular = É necessário um titular
field.required.conta.cpf = É necessário um CPF
field.required.conta.senha = É necessário uma senha
field.required.conta.senhaConfirma = É necessário confirmar a senha digitada
field.required.conta.categoria = É necessário escolher uma categoria
field.incorrect.conta.cpf = O cpf pode ter apenas 11 digitos
field.incorrect.conta.senhaConfirma = As senhas são diferen
solução!

Resolvi o problema colocando um sistema de ifs e else para ver se nas mensagens de erro continham palavras específicas e mandar os erros para o jsp de criar conta e funcionou. ContaController.java

//resto omitido
@RequestMapping("/verificador")
    public ModelAndView gravar(MultipartFile image ,@Valid Conta c, BindingResult br, RedirectAttributes ra) {
        if (br.hasErrors()) {
            List<String> erros = new ArrayList<String>();
            for (ObjectError e : br.getAllErrors()) {
                if(e.toString().contains("required") && !erros.contains("É necessário preencher todos as informações abaixo")) {
                    erros.add("É necessário preencher todos as informações abaixo");
                } else if (e.toString().contains("incorrect")){
                    if(e.toString().contains("cpf")) {
                        erros.add("O CPF deve ter apenas 11 dígitos");
                    } else if(e.toString().contains("senha")) {
                        erros.add("As senhas são diferentes");
                    }
                }
            }
            ra.addFlashAttribute("erros", erros);
            return new ModelAndView("redirect:criar-conta");
        } else {
            System.out.println(image.getOriginalFilename());
            String path = salva.salvar("user-images", image);
            c.setImagePath(path);
            c.setDataCriacao(Calendar.getInstance());
            c.setSaldo(0.0);
            cdao.gravar(c);
            return new ModelAndView("sucesso");
        }
    }
//resto omitido

criaContaForm.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>MyBank - Nova conta</title>
</head>
<body>
    <h1>Criar uma nova conta</h1>
    <c:forEach items="${erros}" var="erro">
        <br>
        <label>${erro}</label>
    </c:forEach>
    <form:form action="${s:mvcUrl('CC#gravar').build()}" method="post"
        modelAttribute="conta" enctype="multipart/form-data">
        <br>
        <div>
            <label>Nome do titular</label><br> <input type="text"
                name="titular">
        </div>
        <div>
            <label>Imagem de usuário</label> <input name="image" type="file">
        </div>
        <div>
            <label>CPF</label><br> <input type="text" name="cpf">
        </div>
        <label>Tipo de conta</label>
        <br>
        <input type="radio" name="categoria" value="normal"> Normal <br>
        <input type="radio" name="categoria" value="especial"> Especial<br>
        <input type="radio" name="categoria" value="personified"> Personified<br>
        <div>
            <label>Senha</label> <br> <input type="password" name="senha">
        </div>
        <div>
            <label>Confirmar a senha</label> <br> <input type="password"
                name="senhaConfirma">
        </div>
        <button type="submit">Criar conta</button>
    </form:form>
</body>
</html>

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