Prezados estou achando uma coisa estranha no VRaptor 3.
Se alguém puder me explicar, ajudar, eu agradeço.
O meu código é o seguinte:
if(listaUsuario.size() != 0){
//código de sucesso!
}//fim if
else{
validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
}//fim else
validator.onErrorUsePageOf(LoginController.class).index();
result.redirectTo(AssuntoController.class).chat();
Só que quando adiciono o erro eu redireciono para a mesma página, de login:
E na página tem as tags:
<c:forEach var="error" items="${errors}">
${error.message}<br />
</c:forEach>
Até aí tudo bem. Quando ele volta pra página com erro adicionado. Ele mostra o erro na página, perfeito!
Mas mesmo assim ele gera exceção quando passa pela linha: validator.onErrorUsePageOf(LoginController.class).index();
Gostaria de não ficar gerando exceção que não me ajuda.
Alguém sabe porque ele gera esse erro?
PS: Preciso redirecionar para a mesma página e não para uma página de erro especifica.
Grato!
Segue o erro:
SEVERE: Servlet.service() for servlet [default] in context with path [/TabsChatV] threw exception
br.com.caelum.vraptor.InterceptionException: There are validation errors and you forgot to specify where to go. Please add in your method something like:
validator.onErrorUse(page()).of(AnyController.class).anyMethod();
or any view that you like.
If you didn’t add any validation error, it is possible that a conversion error had happened.
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.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.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
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.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.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.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.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.pico.PicoProvider.provideForRequest(PicoProvider.java:179)
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
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:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
qual versão do VRaptor?
PS: sério que vc coloca comentários em todos os }? o.0
Rsrs. Eu sou muito metódico cara!!
Eu to usando a versão 3, VRaptor3.
Eu inda não tentei jogar para uma outra página. Mas não é isso que eu queria. Tinha que aparecer o erro na mesma página.
qual versão 3? 3.3.1? 3.2.0?
ele tá passando pela linha do validator.onErrorUse…?
3.3.1
Com certeza! É nessa linha mesmo que dá erro.
Debugando:
else{
validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
}//fim else
validator.onErrorUsePageOf(LoginController.class).index();
result.redirectTo(AssuntoController.class).chat();
ele entra no else.
Passa na linha
validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
depois vai para a linha:
validator.onErrorUsePageOf(LoginController.class).index();
e aí dá br.com.caelum.vraptor.InterceptionException.
e entra no catch.
try{
//Código
if(listaUsuario.size() != 0){
//Código
}//fim if
else{
validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
}//fim else
validator.onErrorUsePageOf(LoginController.class).index();
result.redirectTo(AssuntoController.class).chat();
}//fim try
catch(Exception e){
e.printStackTrace();
}//fim catch
tire o try…catch exception!
a linha validator.onErrorUsePageOf(LoginController.class).index(); lança uma exceção caso hajam erros, e o VRaptor usa isso pra fazer a validação. Como vc fez o try…catch e ignorou a exceção vc quebrou o comportamento do VRaptor.
uhm… Valeu!! É isso mesmo.
Achei isso meio estranho.
Quer dizer que se eu fizer um bloco try/catch e depois colocar validator.onErrorUsePageOf…
e quiser fazer outra coisa caso não dê erro. Eu vou ter que abrir outro try/catch pra colocar outro código.
Tipo assim:
try{
if(listaUsuario.size() != 0){
usuario = listaUsuario.get(0);
session.setAttribute("usuario", usuario);
global.getUsuariosOnline().add(usuario);
entityManager.close();
}//fim if
else{
validator.add(new ValidationMessage("Login ou senha inválidos","erro"));
}//fim else
}//fim try
catch(Exception e){
e.printStackTrace();
}//fim catch
validator.onErrorUsePageOf(LoginController.class).index();
try{
//mais código que eu gostaria de executar se não houver erro
}
catch(Excption e){
}
result.redirectTo(AssuntoController.class).chat();
É isso?
Como se não houver erro adicionado ele não gera aquela exceção eu prefiro colocar tudo em um try/catch mesmo. Essa exceção não tem tanto problema.
pra quê colocar esses try…catch’s?
ignorar todas as exceções é a pior coisa que vc pode fazer na sua aplicação.
não sei onde vc aprendeu isso, mas te ensinaram errado.
Deixa a exceção rolar, daí pelo menos vc vai saber que tem algo errado e vc pode se recuperar de algum jeito.
Que isso cara!
Essa página é de requisição. Se eu não tratar erro eu vou jogar erro na tela pro usuário ver stackTrace.
E em outras partes da aplicação o try/catch ajuda se eu quiser tratar erro. Dar um rollback por exemplo.
O fato do VRaptor3 criar essa exceção não tem problema. Mesmo porque, na prática não muda nada.
Só não entendi porque ele gera essa exceção.
br.com.caelum.vraptor.validator.ValidationException
na boa, você deveria aprender mais sobre desenvolvimento java pra web…
se você não quer que o usuário veja a sua stacktrace, vc customiza a página de erro do servidor. Vc faz isso com uma configuração no web.xml (procure por error-page)
esconder o erro no código é ERRADO.
try {
} catch (Exception e) {
//nada ou só o e.printStacktrace
}
é a pior coisa que você pode fazer na aplicação.
se vc vai colocar alguma coisa no catch, tudo bem, mas ignorá-lo é ERRADO.
você vai criar uma fonte infinita de bugs na sua aplicação.
resumindo: try…catch não é errado, mas ignorar a exception é.
desculpe o tom agressivo, mas é justamente pra chamar a sua atenção.
o VRaptor lança ValidationException pois qdo dá erro de validação vc não quer que execute o resto da sua lógica. E ele usa a validation exception para fazer o redirect que vc configurou
É conheço.
Bem, se você escreve suas aplicações sem try/catch tudo bem.
Os códigos que eu postei eu escrivi agora. Não é de uma aplicação de verdade é só pra teste.
não me leve a mal, mas eu já perdi 2 dias tentando resolver um bug misterioso numa aplicação, e a causa dele era um try…catch vazio. Ou seja, aprendi que isso é ruim do jeito ruim.
Ta certo cara!
O nome já diz, “catch”.
Se você vai capturar o erro pra não fazer nada com ele. É melhor não ter.