VRaptor3 + Hibernate Validator 3.1.0 GA

10 respostas
J

Estou recebendo a seguinte exception com Hibernate Validator

package com.jvds.telecon.controller;

import java.util.ArrayList;
import java.util.List;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.Hibernate;
import br.com.caelum.vraptor.validator.Message;
import br.com.caelum.vraptor.view.Results;

import com.jvds.modelo.CadClassificacao;
import com.jvds.modelo.ParametrosWeb;
import com.jvds.spring.BeanCadClassificacao;

@Resource
public class CadClassificacaoController {
	private final Result result;
	private CadClassificacao cadClassificacao = new CadClassificacao();
	private List<CadClassificacao> lista = new ArrayList<CadClassificacao>();
	private final BeanCadClassificacao beanCadClassificacao;
	private Validator validator;
	
	public CadClassificacaoController(Result result,Validator validator, BeanCadClassificacao beanCadClassificacao) {
		// TODO Auto-generated constructor stub
		this.result = result;
		this.validator = validator;
		this.beanCadClassificacao = beanCadClassificacao;
	}
	
	@Post
	@Path("/cadclassificacao")
	public void adiciona(CadClassificacao cadclassificacao) {
		// TODO Auto-generated method stub
		this.validator.addAll(Hibernate.validate(cadclassificacao));
		this.validator.onErrorUse(Results.page()).of(CadClassificacaoController.class).formulario();
		this.beanCadClassificacao.getDaoGenerico().getDao().salvar(cadclassificacao);
		//Redirect redireciona a logica de negocio		
		this.result.use(Results.logic()).redirectTo(CadClassificacaoController.class).formulario();
	}
		
	@Get
	@Path(priority=1, value="/cadclassificacao")
	public void formulario() {
		// TODO Auto-generated method stub
		//Forward redireciona direto a pagina		
		this.result.include("cadclassificacaolist", lista()).include("cadclassificacao", this.cadClassificacao).use(Results.page()).forward("/WEB-INF/jsp/cadClassificacao/cadclassificacao.jsp");
		//return new CadClassificacao();
	}
}
br.com.caelum.vraptor.InterceptionException: org.hibernate.validator.InvalidStateException: validation failed for: com.jvds.modelo.CadClassificacao

at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:76)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:72)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)

at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)

at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)

at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)

at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)

at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)

at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)

at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)

at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)

at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)

at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)

at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)

at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)

at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)

at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)

at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)

at org.mortbay.jetty.Server.handle(Server.java:326)

at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)

at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)

at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)

at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)

at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)

at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)

at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

10 Respostas

Lucas_Cavalcanti

deveria ter dado o erro de validação e parado em:

this.validator.addAll(Hibernate.validate(cadclassificacao));          this.validator.onErrorUse(Results.page()).of(CadClassificacaoController.class).formulario();

a exception que deu acontece quando vc tenta salvar (ou atualizar) um dado inválido… tem mais informações nessa stacktrace? mais pra baixo fala onde deu o problema de verdade?

D

Eu tive o mesmo problema usando a versão 3, atualizei para a versão 4.01 GA e funcionou em partes, pois esta dando um erro em:

<blockquote>br.com.caelum.vraptor.InterceptionException: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator

br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:76)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:72)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)

br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)

br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)

br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)

br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

</blockquote>

Agora se eu comento o codigo onde chama o metodo Hibernete.validate, funciona, dai eu pego o erro na view, onde eu verifico se existe erros, se existir eu informo na tela, mais essa não é a melhor solução, acredito que tenha melhor.

D

A propósito estou querendo usar o Caelum Stella, mais pelo que eu vi na documentação em configuração ele tem como dependência a versão 3 hibernate validator.

Lucas_Cavalcanti

vc não está com o hibernate-validator no seu classpath…

use a versão que está no zip do vraptor, pasta lib/optional.

O hibernate-validator 4 mudou bastante a api, então o VRaptor não suporta ele ainda… mas vamos fazer isso em breve. Essa versão é meio nova, demora um pouco mesmo para os frameworks começarem a suportá-la

[]'s

J

lucascs:
vc não está com o hibernate-validator no seu classpath…

use a versão que está no zip do vraptor, pasta lib/optional.

O hibernate-validator 4 mudou bastante a api, então o VRaptor não suporta ele ainda… mas vamos fazer isso em breve. Essa versão é meio nova, demora um pouco mesmo para os frameworks começarem a suportá-la

[]'s

Nao estou usando a versao 4.0.2 ainda nao testei com ela sei q para usar precisa de mais um pacote do hibernate que é “Bean Validation TCK 1.0.3.GA” pelo que olhei na documentacao estou usando o que esta no assunto(Hibernate Validator 3.1.0 GA) ja resolvi meu problema tinha isso no html que esta fazendo dar pau nao sei o pq disso saberia me dizer.
Outra duvida para pegar a variavel de erro na validacao tinha isto aqui no meu html e agora vraptor3 como faço.

Fazendo dar PAU

<c:if test="${cadclassificacao.inativo == 'T'}">
                                <input type="checkbox" name="cadclassificacao.inativo" value="${cadclassificacao.inativo}" onclick="javascript: if(this.checked == true) {this.value = 'T'} else {this.value = 'F'};" checked="checked" tabindex="02">						
                            </c:if>
                            <c:if test="${cadclassificacao.inativo != 'T'}">
                                <input type="checkbox" name="cadclassificacao.inativo" value="${cadclassificacao.inativo}" onclick="javascript: if(this.checked == true) {this.value = 'T'} else {this.value = 'F'};" tabindex="02">						
                            </c:if>

HTML para Pegar o Erro de Validacao VRaptor 2

<c:forEach var="error" items="${errors.iterator}">
		${error.path}
	</c:forEach>

Obrigado !!!
Joao Vitor

Lucas_Cavalcanti
<c:if test="${not empty errors}">
	<c:forEach var="error" items="${errors}">
		${error.category}  ${error.message}<br />
	</c:forEach>
</c:if>
D

A versão do hibernate eu tive que atualizar porque a 3 não estava funcionando, dai tive que alterar.

Dava o mesmo problema que [email removido] falou, e a versão que eu estava usando do hibernate validator é a mesma que estava no classpath da aplicação de teste do vraptor mydvds.

Sabe me dizer se teremos uma versão compativel do vraptor com a versão 4 meio logo?

Lucas_Cavalcanti

a compatibilidade com a versão 4 não está marcada pra próxima versão (3.0.3)… então vai demorar ainda um pouquinho pra sair (talvez saia na 3.0.4)…

D

eu percebi que usando a versão 4 do jeito que esta, eu ainda consigo fazer o que eu quero, que é validar os dados.

Mais eu não entendi a utilidade do Hibernate.validade do vraptor, já que o hibernate esta fazendo validando, eu somente chamo metodo da seguinte forma:

Dessa forma eu valido meus dados, por isso não entendi a utilidade do Hibernate.validate.

G

Essa classe transforma as mensagens do hibernate (que é um array de InvalidValues) em objeto de erros do vraptor.

Criado 3 de dezembro de 2009
Ultima resposta 3 de dez. de 2009
Respostas 10
Participantes 4