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.
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
[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…
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}
}
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}
}
}
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.
[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);
}