Vraptor 3.5.2-SNAPSHOT validation exception

Olá!

Após atualizar o VRaptor da versao 3.5.1 para 3.5.2-SNAPSHOT recebi o seguinte erro quando tento realizar login na minha aplicacao:

Resumo do stacktrace:

Caused by: javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:284)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:133)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91)
	at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForDefaultGroup(ValidatorImpl.java:855)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForCurrentGroup(ValidatorImpl.java:768)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyInContext(ValidatorImpl.java:670)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateProperty(ValidatorImpl.java:169)
	at br.com.caelum.vraptor.validator.DefaultBeanValidator.validateProperties(DefaultBeanValidator.java:86)
	at br.com.caelum.vraptor.validator.DefaultValidator.validateProperties(DefaultValidator.java:81)
	at br.com.rosanetur.loja.controle.ClientUsersController.login(ClientUsersController.java:434)
        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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)

Caused by: java.lang.NullPointerException
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.matchPart(EmailValidator.java:99)
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.isValid(EmailValidator.java:83)
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.isValid(EmailValidator.java:43)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:281)

O meu controller:

@Post @Path("/login")
	
	public void login(Usuario usuario, boolean persistentSession)
	{		
		validator.validateProperties(usuario, "login");
}

Houve mudanças nos metodos da Bean Validation da versao 3.5.1 para a 3.5.2-SNAPSHOT ?

Caused by: java.lang.NullPointerException  
    at org.hibernate.validator.internal.constraintvalidators.EmailValidator.matchPart(EmailValidator.java:99)

Está dando NullPointerException no seu EmailValidator, talvez seja no seu objeto o problema.

Acho que não teve nenhuma alteração no DefaultBeanValidator do 3.5.1 pro 3.5.2.

Não parece ser um erro do VRaptor e sim um erro do EmailValidator.

Na situação que o erro está acontecendo, o login que está sendo enviado é null? Caso seja null, talvez o EmailValidator não esteja tratando valores nulls, você pode tentar adicionar um @NotNull na propriedade, deste modo será validado se ele não é null antes de validar se é um e-mail valido.

Nykolas, não é null. O login está sendo preenchido corretamente. Fiz um syso em usuario.getLogin antes de chamar validator.validateProperties e o login foi exibido conforme esperado, isto é, não é nulo.

Esquece o que eu falei sobre o EmailValidator tratar null, porque eu olhei na classe dele e ele faz o tratamento.

https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/EmailValidator.java?source=c

O problema parece estar na hora que ele pega a primeira parte do email(antes do @) e tenta validar de acordo com a expressão regular dele.

Você sabe dizer qual o valor do campo “login” quando esse erro acontece?

o login é um simples e-mail. Na versao 3.5.1 não ocorre quaisquer problemas. Na versão 3.5.2-snapshot ocorre esse problema. Parece que esse cara lidou com o mesmo problema que eu: http://stackoverflow.com/questions/13350537/inject-service-in-constraintvalidator-bean-validator-jsr-303-spring

só que no meu caso, a anotacao é a @org.hibernate.validator.constraints.Email , não é uma validacao customizada

Qual versão do Hibernate Validator você está usando?

Eu fiz um teste aqui com VRaptor 3.5.2-SNAPSHOT e Hibernate Validator 5.0.1-Final e não tive nenhum problema.

Modelo:

public class TestModel {
	@Email
	public String login;
}

Controller:

@Resource
public class TestController {

	private final Validator validator;
	
	public TestController(Validator validator) {
		this.validator = validator;
	}

	@Get("/test")
	public void test() {
		TestModel model = new TestModel();
		model.login = "nykolas.lima@gmail.com";
		
		validator.validateProperties(model, "login");
		
		System.out.println(validator.hasErrors());
	}
	
}

a minha versao é a mesma que a sua. hibernate validator 5.0.1.Final

Eu rodei minha bateria de testes que usa o hibernate validator em cima desse modelo e não ocorreu nenhum problema. A anotacao @Email que voce usou é a do hibernate?

A versao 3.5.1 do VRaptor usa a versao 5.0.0.FINAL do hibernate validator. Segundo esse link, https://hibernate.atlassian.net/browse/HV-625 , a anotacao @Email do hibernate tem um bug que foi
corrigido na versao 5.0.0.ALPHA1

Curiosamente, na versão 3.5.1 do VRaptor eu nao tive quaisquer problemas com essa anotacao @Email, mas na versao 3.5.2-SNAPSHOT do Vraptor, o problema apareceu.

talvez o que seja diferente é esse código:

ele registra um ValidationFactory diferente:

no seu erro aparece alguma dessas classes?

Lucas, o erro completo é esse:

SEVERE: Servlet.service() for servlet [default] in context with path [/grupodeviagem] threw exception
br.com.caelum.vraptor.InterceptionException: br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
	at br.com.rosanetur.loja.interceptors.ExceptionsInterceptor.intercept(ExceptionsInterceptor.java:42)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.rosanetur.loja.interceptors.CredentialsInterceptor.intercept(CredentialsInterceptor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:96)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.com.rosanetur.loja.http.filtros.FiltroGeral.doFilter(FiltroGeral.java:145)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.rosanetur.loja.interceptors.ExceptionsInterceptor.intercept(ExceptionsInterceptor.java:30)
	... 45 more
Caused by: javax.validation.ValidationException: HV000028: Unexpected exception during isValid call.
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:284)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:133)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91)
	at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForDefaultGroup(ValidatorImpl.java:855)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForCurrentGroup(ValidatorImpl.java:768)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyInContext(ValidatorImpl.java:670)
	at org.hibernate.validator.internal.engine.ValidatorImpl.validateProperty(ValidatorImpl.java:169)
	at br.com.caelum.vraptor.validator.DefaultBeanValidator.validateProperties(DefaultBeanValidator.java:86)
	at br.com.caelum.vraptor.validator.DefaultValidator.validateProperties(DefaultValidator.java:81)
	at br.com.rosanetur.loja.controle.ClientUsersController.login(ClientUsersController.java:441)
	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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 58 more
Caused by: java.lang.NullPointerException
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.matchPart(EmailValidator.java:99)
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.isValid(EmailValidator.java:83)
	at org.hibernate.validator.internal.constraintvalidators.EmailValidator.isValid(EmailValidator.java:43)
	at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:281)
	... 73 more

tente não usar o validateProperties e vê se funciona.

O campo login na classe Usuario está anotado assim:

@Column(unique=true)
@Index(name="IDX_USUARIO_LOGIN")
@NotBlank
@CheckCase(CaseMode.MINUSCULAS)
@org.hibernate.validator.constraints.Email
private String login;

Quando eu removo a anotacao @Email, a chamada a validator.validateProperties(usuario, “login”);
funciona normalmente.

O validateProperties funciona, o problema parece que é com a validação @Email

Voce ta usando qual versao do hibernate validator thiago?

roda o mvn dependency:tree só pra confirmar…

muda pra validator.validate(usuario) e veja se funciona.

Nykolas, fiz o que voce me falou mas a minha versao é a versao 5.0.1.Final do hibernate validator.

Lucas, ao fazer validator.validate(usuario); a mesma exception é lançada, na hora que faz a validação @Email.

Eu insisto que o problema é com o bendito @org.hibernate.validator.constraints.Email. Se eu troco para outra anotacao do hibernate, ou uma anotacao personalizada da minha aplicacao, o erro nao ocorre.

Eu não entendi muito bem o que fazer para resolver o problema, mas parece que o caminho é por aqui: http://t1265.codeinpro.us/q/51501e53e8432c042615e27b