Vraptor 3.5.2-SNAPSHOT validation exception

25 respostas
T

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 ?

25 Respostas

K
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.

N

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.

T

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.

N

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?

T

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

T

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

N

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 = "[email removido]";
		
		validator.validateProperties(model, "login");
		
		System.out.println(validator.hasErrors());
	}
	
}
T

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?

T

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.

L

talvez o que seja diferente é esse código:

ele registra um ValidationFactory diferente:

no seu erro aparece alguma dessas classes?

T

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
L

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

T

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.

T

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

N

Voce ta usando qual versao do hibernate validator thiago?

roda o mvn dependency:tree só pra confirmar…

L

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

T

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.

T

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.

T

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

T

Alguma sugestão?

T

Boa tarde a todos, fiz a atualização do VRaptor 3.5.3 pensando que talvez o problema tivesse sido resolvido, mas o problema persiste. Alguém dá um help?

F

Thiago, eu também tentei atualizar o VRaptor e tomei esse erro.

Descobri o porque está dando o erro, mas como não manjo do funcionamento interno do framework, não sei apontar se esse comportamento era esperado, se é alguma coisa que eu deveria fazer, se é bug do VRaptor.

Enfim, basicamente na versão 3.5.1 o EmailValidator (e todos outros validators) eram instanciados pelo org.hibernate…ConstraintValidatorFactoryImpl, e a instância de EmailValidator era inicializada corretamente.

Agora, no VRaptor 3.5.2+, existe um br.com.caelum.vraptor.validator.DIConstraintValidatorFactory que pelo pouco que vi, parece que ele tenta encontrar uma implementação do EmailValidator no contexto DI (no meu caso Spring), se ele não acha ele instância um novo usando um tal de ObjenesisInstanceCreator.

O problema é que esse Objenesis instancia a classe sem rodar as inicializações, e aí o EmailValidator fica todo zuado, com campos nulos.

Acho que alguém do VRaptor poderia dar uma luz…

Por enquanto eu vou ficar no 3.5.1 que tá funcionando.

Abs,

T

Pois é Felipe, também vou manter a versão 3.5.1 enquanto esse bug não é corrigido. Vou abrir uma issue lá no vraptor

T

está aberta: https://github.com/caelum/vraptor/issues/583

D

tenta rodar com esta versão do hibernate-validator: 4.1.0.Final

eu tive alguns problemas de dependência com vraptor 3.5.x e usando esta versão funciona.
no meu caso percebi que era problema por causa do jboss e do plugin hibernate4 do vraptor e o problema não era na validação, mas sim dava uma exception de NoMethod

como não consegui descobrir exatamente o que era estou usando esta versão que funciona.
também utilizo o spring como provider.

se funcionar talvez ajude a encontrar o problema

Criado 4 de agosto de 2013
Ultima resposta 13 de nov. de 2013
Respostas 25
Participantes 6