Tratar exception com vRaptor 3

Boa Noite!

Amigos gostaria de saber como tratar uma excption no vraptor 3.

Tipo assim vou excluir um registro que tem referencia a outro, a exclusão não é possivel ai gostaria de mostrar uma mensagem pro usuário em vez de mostrar a janela de erro.

Aguardo uma ajuda do pessoal.

desde já agradeço o grupo guj pelo apoio.

Abraço

Ta usando o Interceptor do Vraptor ? de fazer tranzações ??? se tiver … é easy! peace of cake!

[code]@Intercepts
public class MyHibernateTransactionInterceptor extends
HibernateTransactionInterceptor {

private final Result result;

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

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

@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);
	}
}

}
[/code]

E então… Tadan! vc cria seu controle bacana, tratador de exceções

[code]@Resource
public HibernateTratadaroDeExceptionController {

//Todo Hibernate Exception vem parar nessa lógica ^^
public void logicaTratadoraDeEx(HibernateException ex) {

}

}[/code]

dei uma editada…

super.intercept(stack, method, instance); //EDITADO, esqueci do SUPER!

tinha que chamar o interceptor do super…

Lavieri

Bom dia!

No momento não estou usando @Intercept, como faço para usar?

é complicado utilizar ele ou fazer sem ele é mais ágil no momento???

Aguardo ajudo do pessoal

Abraço

só de criar essa classe ai que falei vc á passa a usar ele hehehe…

bom o que ele faz é cuidar de tranzações pra vc (eu não gosto como faz, pq ele abre e fecha tranzação em toda requisição, o que nem sempre é legal)

eu implementei uma anotação pra identificar os métodos que quero q a tranzação ocorra…

Mostra como vc faz suas sessions, que ai da pra judar melhor… mostra um trecho do código onde ocorre as Hibernate Exceptions

o interceptor criado não precisa (na verdade não deve) estender HibernateTransactionInterceptor, a menos que vc queira registrá-lo e ele ainda não foi registrado num custom provider

Lucas

Como devo fazer então???

tem como me ajudar?

sou novo nesta área

abraço

Pessoal, quando implemento esse método.

public boolean accepts(ResourceMethod arg0) {
        return !usuario.isLogado() && method.containsAnnotation(Restrito.class);
    }

ele diz que tenho q criar a classe method no pacote. Porque isso ocorre???
Meus imports estão assim:

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.catequese.controller.*;
import br.com.catequese.security.UsuarioWeb;
import br.com.caelum.vraptor.Result;

import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;

Please, alguem pode me ajudar???

abraço
Lico

Boa Tarde!

Amigos, estou no aguardo da ajuda de todos na medida do possível.

Abraço a todos

repito…

[quote=Lavieri]…
Mostra como vc faz suas sessions, que ai da pra judar melhor… mostra um trecho do código onde ocorre as Hibernate Exceptions[/quote]

Lavieri

Boa Tarde!

Minha Session

package br.com.catequese.util;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

/**
 *
 * @author Lico
 */
@Component
public class HibernateSession implements ComponentFactory<Session> {
    private final SessionFactory factory;
    private Session session;

    public HibernateSession(SessionFactory factory) {
        this.factory = factory;        
    }

    @PostConstruct
    public void abre(){
        this.session = factory.openSession();
    }

    public Session getInstance(){
        System.out.println("Iniciou o ComponentFactory - Session");
        return this.session;
    }

    @PreDestroy
    public void fecha(){
        this.session.close();
    }

}

Minha Fabrica de Sesão

package br.com.catequese.util;

import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

/**
 *
 * @author Lico
 */
@Component
@ApplicationScoped
public class HibernateSessionFactory implements ComponentFactory<SessionFactory>{

    private SessionFactory factory;

    @PostConstruct
    public void abre() {
        AnnotationConfiguration configuration = new AnnotationConfiguration();
        configuration.configure();        
        this.factory = configuration.buildSessionFactory();
    }

    public SessionFactory getInstance() {
        System.out.println("Iniciou o ComponentFactory - SessionfACTORY");
        return factory;
    }

    @PreDestroy
        public void fecha() {
        this.factory.close();
    }
}

faz isso…

[code]@Intercepts
public class MyHibernateTransactionInterceptor extends
HibernateTransactionInterceptor {

private final Result result;

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

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

@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);
	}
}

}
[/code]

e então veja se sempre que ocorrer uma exceção ele não vai parar na lógica correta…

Obs.: troque HibernateTratadaroDeExceptionController.class pelo controle onde vc quer tratar o erro

e troque logicaTratadoraDeEx(ex); pelo nome da lógica onde vc quer tratar o erroo …

isso vai funcionar

Obs.: usando esse interceptor, vc não precisa mais abrir e fechar as tranzações isso vai acontecer automaticamente… se não quiser q isso ocorrar fala, que eu mesmo uso outra solução…

BOm dia!

Lavieri

Tem como você me da uma exemplo como ficaria o método logicaTratadoraDeEx(ex);

Eu fiz assim e não mostra a mensagem na tela:

//Todo Hibernate Exception vem parar nessa lógica ^^
     public void logicaTratadoraDeEx(Exception ex){
        new Exception("Ocorreu um erro");
      
     }

Abraço.

Lico

      private final Result reuslt;
      public void NomeDaClasseDoControle(Result result) {this.result = result;}

//Todo Hibernate Exception vem parar nessa lógica ^^
     public void logicaTratadoraDeEx(Exception ex){
        result.include("ex",ex); //aqui fica a excecao pra econtrar ela na pagina use ${ex} por exemplo ${ex.message}
        
        //outra fora seria fazer return ex; ... nessa segunda forma, vc poderia ler na pagina usando ${exception}
     }

Lavieri

Seguinte tentei fazer como você mencionou,

mas não esta funcionando.

Tipo eu executo o método ele não mostra o erro, mas não mostra a mensagem do erro para o usuário.

O código ta assim:

@Intercepts
 public class MyHibernateTransactionInterceptor  extends
         HibernateTransactionInterceptor {

     private final Result result;

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

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

     @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);
         }
     }
 }
@Resource
public class HibernateTratadaroDeExceptionController {

    private final Result result;

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

      public void logicaTratadoraDeEx(Exception ex){
         result.include("ex",ex); //aqui fica a excecao pra econtrar ela na pagina use ${ex} por exemplo ${ex.message}

         //outra fora seria fazer return ex; ... nessa segunda forma, vc poderia ler na pagina usando ${exception}
      }
}

na pagina

WEB-INF/jsp/hibernateTratadaroDeException/logicaTratadoraDeEx.jsp

tem a Expression Language ${ex} ?? ou ${ex.message} ??

vc criou essa pagina ? ta acontecendo o q ? error 404 ? erro 500- ?? ou o q ?

Lavieri, Boa Noite!

Desculpe a demora pra te responder novamente, é q estive sem tempo mesmo.

continuando o estudo do vraptor sobre exception.

No Controller esta assim:

@Resource
public class HibernateTratadaroDeExceptionController {

    private final Result result;

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

 //Todo Hibernate Exception vem parar nessa lógica ^^
      public void logicaTratadoraDeEx(Exception ex){
         result.include("ex", ex); //aqui fica a excecao pra econtrar ela na pagina use ${ex} por exemplo ${ex.message}

         //outra fora seria fazer return ex; ... nessa segunda forma, vc poderia ler na pagina usando ${exception}
      }
}

No Intercept esta assim:

@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);
         }
     }
      
    @Override
      public boolean accepts(ResourceMethod method) {
          return true;
      }
}

Na minha jsp esta assim:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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>${ex}</h1>
    </body>
</html>

Ja tentei usar

${ex.message}

o pior q não mostra absolutamente nada nenguma mensagem de erro nem na saida do tomcat nem no netbeans.

simplesmente não exclui mas tambem não mostra erro.

Como resolver isso?

Abraço

coloca um log (ou um System.out.println) na lógica que trata a exceção pra ver se tá passando por lah

Bom dia, Lucas!

fiz com você sugeriu e realmente ele entra no metodo e lança isso no System.out.print

Aqui esta o erroorg.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

oq fazer para lançar no jsp???

xii…

não sei a solução que o lucas vai te dar… porem…

[code]# @Resource
public class HibernateTratadaroDeExceptionController {

 private final Result result;
 private final Request request;  

 public HibernateTratadaroDeExceptionController(Result result,HttpServletRequest request) {  
     this.result = result;
     this.request = request;
 }  

//Todo Hibernate Exception vem parar nessa lógica ^^
public void logicaTratadoraDeEx(Exception ex){
//result.include(“ex”, ex); //aqui fica a excecao pra econtrar ela na pagina use ${ex} por exemplo ${ex.message}

      //outra fora seria fazer return ex; ... nessa segunda forma, vc poderia ler na pagina usando ${exception}  
      //tenta assim
      request.setAttribute("ex",ex);
   }  

}[/code]