vraptor3 - validator

Pessoal,

estou começando agora com o Vraptor3 acabei de sair do Struts2 e estou gostando bastante porém tenho algumas dúvidas!!!

Estou gerando erros de varias categorias diferentes:

if(pais.getNome().isEmpty()) 
   validator.add(new ValidationMessage("Campo Nome é obrigatório!", "erroNome"));
if(pais.getSexo().isEmpty())
   validator.add(new ValidationMessage("Campo Sexo é obrigatório!", "erroSexo"));		

validator.onErrorUse(Results.page()).of(PaisController.class).cadastro();

eu queria saber se o único jeito de exibir os erros na minha página seria dentro dor forEach

<ul>
   <c:forEach items="${errors}" var="error">
	<li>${error.message}</li>
   </c:forEach>
</ul>

ou se tem alguma forma de eu identificar na minha jsp de qual categoria se trata aquele erro e exibir abaixo de cada campo o erro de acordo com o campo…

A idéia do forEach é para o caso de vir mais de um erro.
Mas se você retornar sempre apenas uma mensagem, você pode pega-la utilizando a posição do array 0.
Algo como:

<c:if test="${!empty errors}">
     <div class="errorClass">
         ${errors[0].message}
     </div>
</c:if>

Obs.: Não testei, mas deve funcionar.

[]´s

[quote=yorgan]A idéia do forEach é para o caso de vir mais de um erro.
Mas se você retornar sempre apenas uma mensagem, você pode pega-la utilizando a posição do array 0.
Algo como:

<c:if test="${!empty errors}">
     <div class="errorClass">
         ${errors[0].message}
     </div>
</c:if>

Obs.: Não testei, mas deve funcionar.

[]´s

[/quote]

yorgan, então como vc viu no meu código eu não retorno apenas um erro eu retorno “N” erros porém para cada erro de uma categoria “X” eu gostaria de exibir em um lugar diferente.

eu não quero exibir todos os erros de categorias diferentes no mesmo lugar.

Também compartilho da mesmíssima dúvida.

Então faça uma verificação pela categoria.

<ul>
     <c:forEach items="${errors}" var="error">
          <c:if test="${error.category == 'erroNome'}">
               <li>${error.message}</li>
          </c:if>
     </c:forEach>
</ul>

Mas daí você teria que criar categorias mais genéricas.

[]´s

Daniel

[quote=yorgan]Então faça uma verificação pela categoria.

<ul>
     <c:forEach items="${errors}" var="error">
          <c:if test="${error.category == 'erroNome'}">
               <li>${error.message}</li>
          </c:if>
     </c:forEach>
</ul>

Mas daí você teria que criar categorias mais genéricas.

[]´s

Daniel[/quote]

Eu até pensei em fazer isso mais achei que ficaria muito “ESCROTO” meu código.

imagina q eu tenho um formulario com 15 campos para serem preenchidos e quero incluir os erros de cada campo ao lado do campo ou abaixo de cada campo, então vc me sugere ter 15 forEach na minha jsp…

como já havia comentado eu venho do Struts2 q no aspecto de validação é bastante simples e comum este tipo de coisa!!!

achei q no vraptor3 existisse alguma coisa do tipo assim:

<ul>
     <li>${error.category.nomeCategoria.message}</li>
</ul>

Mas você quer criar uma categoria para cada campo?
Não pode ser apenas error, warn e info?

[quote=yorgan]Mas você quer criar uma categoria para cada campo?
Não pode ser apenas error, warn e info?

[/quote]

Não necessariamente!

eu só coloquei os nomes da categorias de acordo com os nomes dos campos pq eu achei q dessa forma tivesse como eu encontrar na jsp e colocar cada categoria proximo ao campo referenciado.

porém se tiver alguma outra forma de fazer isso que quero fazer, identificar qual é o erro e colocar no seu local de acordo com o campo. ótimo!!!

[]'s

Isso pode ser resolvido criando seu validator implementando encima do validator padrão do vraptor.

Outra sugestão é criar uma taglib estilo ao que tem no JSF, onde você diz qual o path da validação. Algo como:

<mytaglib:error for="foo" /> <!-- aqui exibe os erros da categoria foo -> <input type="text" name="foo" />

[quote=garcia-jj]Isso pode ser resolvido criando seu validator implementando encima do validator padrão do vraptor.

Outra sugestão é criar uma taglib estilo ao que tem no JSF, onde você diz qual o path da validação. Algo como:

<mytaglib:error for="foo" /> <!-- aqui exibe os erros da categoria foo -> <input type="text" name="foo" />

[/quote]

É garcia-jj se eu não encontrar outra forma, acho q vou acabar adotando seu método q pra mim parece ser mais interessante…

não tem nada pronto ainda no VRaptor pra exibir erros por categoria… você pode usar a sugestão do garcia mesmo…

essas validações que aparecem nos campos podem ser feitas só do lado do cliente, usando javascript, para evitar que a requisição seja feita com dados inválidos…

existem diversas ferramentas em javascript pra fazer isso… uma delas é o JQuery validator (http://bassistance.de/jquery-plugins/jquery-plugin-validation/) que é bem fácil de usar…

quanto a fazer algo do tipo ${errors.nomeDaCategoria} a gente pode até tentar fazer, mas não sei se a Expression Language suporta esse tipo de coisa… abra uma issue em http://github.com/caelum/vraptor/issues sobre isso por favor? se possível em ingles linkando pra essa conversa…

Lucas, o EL só suportaria isso se for um map. Assim se você tem um mapa de mensagens sendo o key o nome do campo dá para fazer algo interessante:

error.myField=O campo precisa ser válido. error.myName=Seu nome está errado.

Agora lembrei… uma coisa que pode ser feita, causando menos impacto na aplicação nem no vraptor é fazer uma taglib que procure dentro do list de mensagens alguma mensagem para esse campo.

Porém há dois problemas: um pelo overhead de varrer o list várias vezes; e outra pelo fato de usar o campo categoria com o nome do campo, isso fica estranho já que o campo category indica outras coisas como ERROR, INFO, WARN.

um jeito fácil de fazer isso é criar um interceptor que converte a lista de messages em um mapa de categoria/erro… e logo após adicionar isso no result, com um nome diferente de errors

eu até tinha pensado em criar uma tld que procurasse dentro da list de erro a categoria, mais tbm não achei interessante não ia ter o forEach na jsp, mas continuaria varrendo a list escondido na tld…

mas Obrigado pela força agora vou analisar as opções enviadas e escolher a melhor para o meu projeto!!!

[]'s