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

Erro com a validação dos campos vazios.

Pessoal, repliquei o projeto conforme o capitulo 2 do curso, a navegação esta ok, os dados estão sendo listados e persistidos no banco normal.

mas quando tento submeter o formulário em branco ao invés de os erros aparecerem tratados na jsp com a tag criada e tudo mais da o seguinte erro:

fev 26, 2018 7:21:42 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [/vraptor4] threw exception [javax.validation.ConstraintViolationException: 2 constraint violation(s) occurred during method validation.
Constructor or Method: public void br.com.caelum.vraptor.controller.UsuarioController.adiciona(br.com.caelum.vraptor.model.Usuario)
Argument values: [br.com.caelum.vraptor.model.Usuario@3b0b162f]
Constraint violations: 
 (1) Kind: PROPERTY
 message: Não pode estar vazio
 root bean: br.com.caelum.vraptor.controller.UsuarioController$Proxy$_$$_WeldSubclass@132143b3
 property path: adiciona.arg0.email
 constraint: @org.hibernate.validator.constraints.NotEmpty(message={org.hibernate.validator.constraints.NotEmpty.message}, groups=[], payload=[])
 (2) Kind: PROPERTY
 message: Não pode estar vazio
 root bean: br.com.caelum.vraptor.controller.UsuarioController$Proxy$_$$_WeldSubclass@132143b3
 property path: adiciona.arg0.nome
 constraint: @org.hibernate.validator.constraints.NotEmpty(message={org.hibernate.validator.constraints.NotEmpty.message}, groups=[], payload=[])] with root cause
javax.validation.ConstraintViolationException: 2 constraint violation(s) occurred during method validation.
Constructor or Method: public void br.com.caelum.vraptor.controller.UsuarioController.adiciona(br.com.caelum.vraptor.model.Usuario)
Argument values: [br.com.caelum.vraptor.model.Usuario@3b0b162f]
Constraint violations: 
 (1) Kind: PROPERTY
 message: Não pode estar vazio
 root bean: br.com.caelum.vraptor.controller.UsuarioController$Proxy$_$$_WeldSubclass@132143b3
 property path: adiciona.arg0.email
 constraint: @org.hibernate.validator.constraints.NotEmpty(message={org.hibernate.validator.constraints.NotEmpty.message}, groups=[], payload=[])
 (2) Kind: PROPERTY
 message: Não pode estar vazio
 root bean: br.com.caelum.vraptor.controller.UsuarioController$Proxy$_$$_WeldSubclass@132143b3
 property path: adiciona.arg0.nome
 constraint: @org.hibernate.validator.constraints.NotEmpty(message={org.hibernate.validator.constraints.NotEmpty.message}, groups=[], payload=[])
    at org.hibernate.validator.internal.cdi.interceptor.ValidationInterceptor.validateMethodInvocation(ValidationInterceptor.java:81)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at 
[restante omitido devido ao tamanho da track]
5 respostas

Oi David, como esta ?

Esse erro é quando voce esta tentando gravar alguma entidade no banco de dados, que ja contem uma chave primaria igual, voce poderia postar seu controller?

solução!

Na realidade, o que está acontecendo é que o nome e o email do usuário estão vazios sendo que isso não é permitido, como pode ser visto nos seguintes trechos do erro:

property path: adiciona.arg0.email
 constraint: @org.hibernate.validator.constraints.NotEmpty
property path: adiciona.arg0.nome
 constraint: @org.hibernate.validator.constraints.NotEmpty

Provavelmente o que está acontecendo é que vc está tentando inserir os dados no BD sem antes verificar se há erros de validação. Poste o código do UsuarioController para a gente poder te ajudar!

Opa, pessoal é isso mesmo, estou enviando o formulário vazio pois quero justamente testar a validação e mostrar ela na tela para o usuário.

Aqui esta o UsuárioController e sua JSP.

@Controller
public class UsuarioController{
    private Result result;

    private UsuarioDAO usuarioDAO;

    private Validator validator;

    @Inject
    public UsuarioController(Result result, UsuarioDAO usuarioDAO, Validator validator){
        this.result = result;
        this.usuarioDAO = usuarioDAO;
        this.validator = validator;
    }

    public UsuarioController(){}


    public void form(){}

    @IncludeParameters
    public void adiciona(@Valid Usuario usuario){
        validator.onErrorRedirectTo(this).form();
        usuarioDAO.adiciona(usuario);
        result.redirectTo(this).lista();
    }

    public void lista(){
        result.include("usuarios", usuarioDAO.lista());
    }
}

a JSP, que deveria mostrar a validação tratada.

<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib tagdir = "/WEB-INF/tags" prefix="alura" %>

<c:import url="/WEB-INF/jsp/header.jsp"></c:import>
<form action="${linkTo[UsuarioController].adiciona(null) }" method="POST">
    <label for="nome">Nome:</label>
    <input type="text" name="usuario.nome" id="nome" class="form-control" value="${usuario.nome}"/>
    <alura:validationMessage name="usuario.nome"></alura:validationMessage>

    <label for="email">Email:</label>
    <input type="email" name="usuario.email" id="email" class="form-control" value="${usuario.email}"/>
    <alura:validationMessage name="usuario.email"></alura:validationMessage>

    <label for="login">Login:</label>
    <input type="text" name="usuario.login" id="login" class="form-control" value="${usuario.login}"/>
    <alura:validationMessage name="usuario.login"></alura:validationMessage>

    <label for="senha">Senha:</label>
    <input type="password" name="usuario.senha" id="senha" class="form-control"/>
    <alura:validationMessage name="usuario.senha"></alura:validationMessage>

    <input type="submit" value="Cadastrar" class="btn"/>
</form>
<c:import url="/WEB-INF/jsp/footer.jsp"></c:import>

David, vc fez a configuração necessária para usar a anotação @Valid criando o arquivo validation.xml dentro da pasta META-INF como visto a partir do minuto 24:00 do vídeo da aula?

Boa noite, David! Como vai?

E aí, conseguiu resolver o seu problema ou ele ainda persiste? Se resolveu, poderia compartilhar com a gente a solução?

Grande abraço!