Exceção ao usar a validação do Hibernate com o Vraptor

7 respostas
N

Caros quando eu tento usar a validação através do método validator.validate(model) com vraptor 3 eu estou recebendo esta exceção:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.validator.InvalidStateException: validation failed for: br.com.intellix.vrerp.modelo.Usuario

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

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

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

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)

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

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

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)

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

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

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

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

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

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

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

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

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

br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)

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

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

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

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

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

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

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

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

br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)

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

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

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

root cause

org.hibernate.validator.InvalidStateException: validation failed for: br.com.intellix.vrerp.modelo.Usuario

org.hibernate.validator.event.ValidateEventListener.validate(ValidateEventListener.java:148)

org.hibernate.validator.event.ValidateEventListener.onPreInsert(ValidateEventListener.java:172)

org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:142)

org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)

org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)

org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)

org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)

org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)

org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)

org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)

org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)

org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)

org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)

org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)

org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)

br.com.intellix.vrerp.dao.impl.UsuarioHibernateDAO.add(UsuarioHibernateDAO.java:21)

br.com.intellix.vrerp.controller.UsuariosController.add(UsuariosController.java:38)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

java.lang.reflect.Method.invoke(Method.java:597)

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

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

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

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)

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

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

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)

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

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

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

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

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

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

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

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

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

br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)

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

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

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

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

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

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

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

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

br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)

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

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

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

Minha classe está anota assim:

package br.com.intellix.vrerp.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@Entity
public class Usuario {

	@Id 
	@GeneratedValue
	private Long id;
	
	@NotNull
	@Length(min= 3, max = 100)
	private String nome;
	
	@NotNull
	@Length(min= 3, max = 20)
	private String login;
	
	@NotNull
	@Length(min= 6, max = 20)
	private String senha;

	//getters e setters
}

meu controller assim

@Post @Path("/usuarios")
	public void add(final Usuario usuario) {
		validator.validate(usuario);		
		validator.checking(new Validations() {{
			boolean loginNaoExiste = !dao.containsUserWithLogin(usuario.getLogin());
			that(loginNaoExiste,"usuario.login","login_ja_existe");
			that(usuario.getLogin().matches("[a-z]+"), "login", "invalid_login");
		}});
		validator.onErrorUsePageOf(UsuariosController.class).novo();
		dao.add(usuario);
		result.include("notice", "Usuário " + usuario.getNome() + " adicionado com sucesso.");
		result.forwardTo(HomeController.class).homePage();
	}

7 Respostas

Lucas_Cavalcanti

habilite por favor o log de debug do vraptor(https://github.com/caelum/vraptor/blob/master/vraptor-blank-project/src/log4j.xml) e procure por essa frase:

“has no validators registered”

aparentemente o VRaptor não conseguiu registrar o validator que vc está usando (hibernate-validator)

N

olá lucas, habilitei o Log porém não apareceu essa mensagem, nem nada parecido.

Lucas_Cavalcanti

e durante a requisição, antes da exception?

N

13:52:43,357 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor HibernateTransactionInterceptor
13:52:43,363 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
13:52:43,363 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for UsuariosController.add(Usuario) as [usuario]
13:52:43,379 DEBUG [OgnlParametersProvider] Applying nome with [Robson]
13:52:43,407 DEBUG [OgnlParametersProvider] Applying login with [robson]
13:52:43,407 DEBUG [OgnlParametersProvider] Applying senha with [ro]
13:52:43,407 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: UsuariosController.addUsuariosController.add(Usuario)] are [br.com.intellix.vrerp.modelo.Usuario@10812ac]
13:52:43,408 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
13:52:43,409 DEBUG [ExecuteMethodInterceptor] Invoking UsuariosController.add(Usuario)
13:52:43,430 DEBUG [JSR303Validator ] there are 0 violations at bean br.com.intellix.vrerp.modelo.Usuario@10812ac.
13:52:43,464 DEBUG [DefaultExceptionMapper] find for exception class org.hibernate.validator.InvalidStateException
29/03/2011 13:52:43 org.apache.catalina.core.StandardWrapperValve invoke

Ele diz que não tem nenhuma violação, mas na verdade tem 1, pois a senha tem que ter no mínimo 6, por isso a exception depois.

Lucas_Cavalcanti

entendi…

vc está com o jar do hibernate-validator4, mas está usando as anotações do hibernate-validator3.

ou troque as anotações de validação pra javax.validation, ou remova o hibernate-validator4 do classpath

N

Puts, era isso mesmo oh Lucas. É que eu tinha copiado os jars do projeto mydvds e lá tem as duas libs, a 3 e 4, deixei só a versão 4 e mudeis os pacotes e funcionou tudo. Só aproveitando a deixa, tem como internacionalizar essas mensagens do hibernate?

muito obrigado pela atenção! :smiley:

Lucas_Cavalcanti

tem sim, é só colocar na anotação de validação:

@Anotacao(..., message="{key_do_messages_properties}")

se tiver {} ele internacionaliza, se não ele coloca a mensagem sem i18nar

Criado 29 de março de 2011
Ultima resposta 29 de mar. de 2011
Respostas 7
Participantes 2