Tratar exception com vRaptor 3

seu jsp está em:
/WEB-INF/jsp/hibernateTratadaroDeException/logicaTratadoraDeEx.jsp ??

tenta colocar um texto antes:

<h1> Mensagem: ${ex.message}</h1>

tenta também trocar o nome por outro aleatório:

result.include("banana", ex);
<h1> Mensagem: ${banana.message}</h1>

(e depois troque pra um nome melhor :P)

Lucas,
Tentei mudar mas continua a mesma coisa.

Quanto a minha estrutura de pasta esta correta igual vc me passou.

Não sei mais oq fazer com isso.

Se mais alguem puder me ajudar agradeço.

Lavieri,

Fiz o teu esquema tambem não rolou.

Meu q pane qdeu agora o erro 500

SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: wrong number of arguments
        at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
        at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
        at br.com.catequese.util.MyHibernateTransactionInterceptor.intercept(MyHibernateTransactionInterceptor.java:33)
        at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:47)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
        at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:65)
        at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
        at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
        at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
        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.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
        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:128)
        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:286)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.IllegalArgumentException: wrong number of arguments
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
        ... 44 more

se alguem souber resolver nos ajude.

abraço

tenta colocar isso no começo da jsp:

<%@page contentType="text/html" pageEncoding="UTF-8" isELIgnored="false"%>  

(modifica o @page que vc jah tem)

Lucas

Nada acontece ainda. Meu jsp esta assim

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page  contentType="text/html" pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Mensagem: ${banana.message}</h1>
    </body>
</html>

faz:

public Exception logicaTratadoraDeEx(Exception ex){
    return ex;
}

e na jsp:

<h1>Mensagem: ${exception} - {exception.message}</h1>

de qqer forma isso era pra estar funcionando normal

caro Lucas fiz conforme o sugerido,

mas nada ocorreu tambem.

Oq esta acontecendo será???

No interceptor, faça:

  public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {  
           try {  
              super.intercept(stack, method, instance); //EDITADO, esqueci do SUPER!  
          } catch(HibernateException ex) {  
              result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(ex);  
              stack.next(method, instance); // faltava isso!
          }  
      }  

Lucas

cara você não acreditará mas nada aconteceu de novo.

segue minha classe Intercept

@Intercepts
public class MyHibernateTransactionInterceptor extends HibernateTransactionInterceptor {
      

     private final Result result;

     public MyHibernateTransactionInterceptor(Session session,Result result) {
         super(session);
         this.result = result;
     }

    @Override   
     public  void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
          try {
             super.intercept(stack, method, instance); //EDITADO, esqueci do SUPER!
         } catch(HibernateException ex) {
             result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(ex);
             stack.next(method, instance); // faltava isso!
         }
     }
      
    @Override
      public boolean accepts(ResourceMethod method) {
          return true;
      }
}

abraço

o teste que eu fiz no blank project e funcionou:

@Intercepts
public class TesteInterceptor implements Interceptor{

	private final Result result;

	public TesteInterceptor(Result result) {
		this.result = result;
	}

	public boolean accepts(ResourceMethod method) {
		return true;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance)
			throws InterceptionException {
		result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(new RuntimeException("aaaaaa"));
	}

}

tire o outro interceptor (só comentar a anotação @Intercepts) e crie esse que eu te passei, vê se aparece a mensagem “aaaaa”…

só por curiosidade, as outras lógicas estão funcionando?

Lucas

Desta maneira que vc sugeriu funcionou mas só mostra a mensagem de erro
ou seja o intercept não deixa acessar mais nada a não ser a mensagem de erro.

Pelo menos funcionou agora temos q designar o metodo q ela deve ser vista.

tenta formatar o PC e refaz o teste ahuahuhua
brincadeira…

que zica em ?

Lavieri

Nem me fale, eu sim estou meio chateado ate por estar com tanto problema igual esse.

nem sei oq dizer rsss.

Abraço

Lucas,

Você tem alguma idéia como resolver a questão pro intercept definir quando é um erro pra dai lançar a mensagem?

Porq da maneira q você fez ele nem abre a tela de login vai direto pro erro.

Abraço e agradeço a ajuda

Tem algo estranho e bizarro no que vc esta fazendo… acabei de testar aqui, e funciona corretamente…

Não fiz com Hibernate pq meu projeto usa um base, e não tenho como extender ele 2 vezes… então segue aki meu teste, que foi bem sucedido…

Criei um Recurso com 2 lógica, uma onde ocorre uma exceção, e outra pra onde a exceção deve ir parar

@Resource public class TestController { public void lancaErro() throws Exception { throw new IllegalStateException("Voa voa exceção..."); } public void seguraEx() {} }

A ideia é a exceção ser lançada em lancaErro() e ir para em seguraEx()

crie então uma página em

WEB-INF/test/seguraEx.jsp

com o conteudo abaixo

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt; &lt;html&gt; &lt;body&gt; ERRO!!!! === ${ex.message} <br/><br/> ${ex.cause} <br/><br/> ${ex} &lt;/body&gt; &lt;/html&gt;

Então fiz um interceptor, que agarra exceções e envia pra seguraEx

@Intercepts public class TestInterceptor implements Interceptor{ private final Result result; public TestInterceptor(Result result) { this.result = result; } @Override public boolean accepts(ResourceMethod method) { return true; } @Override public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException { try { stack.next(method, resourceInstance); } catch (Exception ex) { result.include(&quot;ex&quot;, ex); result.forwardTo(TestController.class).seguraEx(); } } }

Então acessei => http://localhost:8080/contexto/test/lancaErro

e o resultado foi o experado… a exceção foi lançada no método lancaErro(); foi para no interceptor, foi incluida dentro de ${ex} e então o fluxo foi enviado para o TestController.class para a lógica seguraEx(), e então a página seguraEx.jsp é exibida, produzindo o texto abaixo!

[code]ERRO!!! === an exception was raised while executing resource method

java.lang.IllegalStateException: Voa voa exceção…

br.com.caelum.vraptor.InterceptionException: an exception was raised while executing resource method[/code]

tem algo estranho ai na sua lógica

Obs.: provavelmente o seu problema é o seguinte

[code]

      } catch(HibernateException ex) {  
          result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(ex);  
      }[/code]

altere esse trecho pelo o abaixo

} catch(Exception ex) { if (ex.getCause() != null && ex.getCause() instanceof HibernateException) result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(ex); else throw ex; }

Lavieri

fiz o teu modelo funcionou como mencionou.

Agora fiz a alteração q vc sugeriu não funcionou tambem.

Vou começar do zero denovo esse intercept, controller e jsp.

tomara q eu tenha sucesso,
não sei oq esta ocorrendo.

mas vou tentar

qqer coisa no interceptor faz:

} catch (Exception ex) {
    result.include("ex", ex);
    result.forwardTo("/WEB-INF/jsp/minhaPaginaDeExcecao.jsp");
}

e vê se funciona

Lucas e Lavieri!

Depois de muita luta descobri o problema.

Era um @interface com do vraptor pra bloquear o acesso mas tinha coisa erra q não funciona com ela.

Mas primeiro vou resolver o problema da exception
depois vejo o erro dessa @interface com Interceptor.

Por enquanto muito obrigado.

e Abraço.

Bom final de semana a todos

Ressuscitando o tópico por ter um problema parecido.
Eu estou implementando o Interceptor que passaram e gostaria que ele capturasse apenas minhas HibernateException’s.
Segue o interceptor:

[code]@Intercepts
public class MyHibernateTransactionInterceptor extends HibernateTransactionInterceptor {

private final Result result;

public MyHibernateTransactionInterceptor(Session session, Result result) {
	super(session);
	this.result = result;
}

public boolean accepts(ResourceMethod method) {
	return true;
}

public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
	try {
		super.intercept(stack, method, instance);
	} catch (Exception ex) { // Gostaria de passar HibernateException aqui.
		System.out.println("Exception: " + ex.getClass().getSimpleName()); // porém aqui sempre vem InterceptionException
		result.forwardTo(UsuariosController.class).erro(ex);
		stack.next(method, instance);
	}
}

}[/code]

Para simular, em uma das controllers estou fazendo o seguinte:

public void adiciona(final Produto produto, List<UploadedFile> imagem) { if (true) { throw new HibernateException("teste"); } }

Solução?
Valeu.