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