[Resolvido]VRaptor Validator + Hibernate Validator

Olá pessoal!

Eu estou usando VRaptor validator e Hibernate Validator e estou com 2 problemas:

No VRaptor validator eu não consigo usar validator.onErrorRedirectTo(this).formularioNovo();

Pois dá a seguinte exception:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method formularioNovo 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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) 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.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.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.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.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)

Porém, quando eu uso validator.onErrorUsePageOf(this).formularioNovo(); funciona, à princípio, porém, não executa a lógica que popula as minhas comboBox, então quando eu vou salvar eu levo outra Exception, a NullPointerException, isso por causa das ComboBox que estão vazias… Eu precisava executar a lógica que popula as comboBox…

O segundo problema é que eu tentei usar a seguinte annotation do hibernate validator: @Min(value = 0, message = "msgCampoQuantidadeValorMinimo") e eu não consigo colocar ela como i18n na forma “tradicional” que é: @Min(value = 0, message = "{msgCampoQuantidadeValorMinimo}") a solução que eu encontrei foi colocar este valor sem chaves e dentro de uma tag <fmt:message />.

Obrigado.

qual é o caused by da exception?

o que acontece quando vc usa a mensagem internacionalizada no hibernate validator?

Aqui está a exception toda do console

GRAVE: Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalStateException 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.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.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.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.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.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71) 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:89) 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.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.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23) at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58) at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:126) at br.com.caelum.vraptor.http.VRaptorResponse.sendRedirect(VRaptorResponse.java:46) at br.com.caelum.vraptor.view.DefaultLogicResult$2.intercept(DefaultLogicResult.java:124) at br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56) at br.com.wsacervowebhibernate.controller.AcervoArquivoController$$EnhancerByCGLIB$$1ca86605.formularioNovo(<generated>) at br.com.wsacervowebhibernate.controller.AcervoArquivoController.adiciona(AcervoArquivoController.java:339) 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) ... 41 more

No problema do hibernate, ele exibe o rotulo com as chaves, por exemplo, vai aparecer isso na tela: {msgCampoQuantidadeValorMinimo}.

isso acontece qdo vc tenta mandar um redirect qdo vc já mexeu em alguma coisa do request…

como está o método que tá dando o redirect? algum método tá dando um forward pra ele?

pra i18n do hibernate validator funcionar vc precisa configurar o bundle no web.xml:

<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>messages</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
		<param-value>pt_BR</param-value>
	</context-param>

Não tem nenhum foward para este método.
Não sei se impacta em alguma coisa, mas quando eu vou subir o meu formulário eu tenho uma série de result.include(“var”, obj); para popular as minhas combos.

No caso do Hibernate, ainda sem sucesso.

bom pela stacktrace, vc recebeu uma requisição pro método

AcervoArquivoController.adiciona

e a partir desse método vc tá redirecionando pro .formularioNovo (com redirectTo, certo?)

antes do redirect vc faz alguma coisa no result? ou no response?

Esse é o meu método que adiciona:

[code]@Privilegio(TipoPrivilegio.Catalogador)
@Post("/arquivo")
public void adiciona(Acervo acervo, String quantidade,
String dataAquisicao, String tiragem, String alturaCm,
String larguraCm, String comprimentoCm, String valorAquisicaoUs,
String valorMercadoUs, String valorSeguroUs) {
try {

		acervo = popularAcervo(acervo, quantidade, dataAquisicao, tiragem,
				alturaCm, larguraCm, comprimentoCm, valorAquisicaoUs,
				valorMercadoUs, valorSeguroUs);

		validator.validate(acervo);
		validator.onErrorForwardTo(this).formularioNovo(); // com fowardTo funciona em partes, pois obtenho muitos erros e piora a situacao

		/*
		 * if (!validaAcervo(acervo)) { SiteUtil.mostrarModal(result,
		 * bundle.getString("msgImpossivelIncluir"),
		 * bundle.getString("msgErro"));
		 * 
		 * result.redirectTo(this).formularioNovo(); return; }
		 */
		// incluindo o responsável pela inclusão
		Usuarios usuarios = new Usuarios();
		usuarios.setCodigoUsuarios(usuarioAcervo.getCodigoUsuario());
		usuarios.setNomeUsuarios(usuarioAcervo.getNomeUsuario());
		usuarios.setPrivilegio(usuarioAcervo.getPrivilegio());

		acervo.setCatalogador(usuarios);
		acervo.setTipoAcervo("A");
		acervoDAO.adicionar(acervo);
		SiteUtil.mostrarModal(result,
				bundle.getString("msgRegistroAdicionado"),
				bundle.getString("msgSucesso"));
		result.redirectTo(this).consultar(parametroDAO.consultar("A"));
	} catch (Exception e) {
		SiteUtil.mostrarModal(result,
				bundle.getString("msgImpossivelIncluir"),
				bundle.getString("msgErro"));
		result.redirectTo(this).formularioNovo(); // essa é a linha 339 onde ele reclama na stackTrace...
	}
}[/code]

PS: Eu reparei que ele lança uma ValidationException, devo tratá-la? Como?

vc sabe que esse popularAcervo o VRaptor consegue fazer automaticamente, né?

troca o onErrorForwardTo para onErrorRedirectTo…

tem alguma chamada ao result ou validator dentro do populaAcervo?

agora eu vi o erro…

vc não pode dar try…catch(Exception), pq o Validator lança exceção para parar o método, se tiver acontecido algum erro…

coloca o try logo depois do validator.onErrorForwardTo(this).formularioNovo(); que vai funcionar