Tratar exception com vRaptor 3

73 respostas
L

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

73 Respostas

L

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

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

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

@Resource
public HibernateTratadaroDeExceptionController {

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

dei uma editada…

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

tinha que chamar o interceptor do super…

L

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

L

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

L

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

L

Lucas

Como devo fazer então???

tem como me ajudar?

sou novo nesta área

abraço

L

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

L

Boa Tarde!

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

Abraço a todos

L

repito…

Lavieri:

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

L

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();
    }
}
L

faz isso...

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

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..

L

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

L
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}
     }
L

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}
      }
}
L

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 ?

L

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

L

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

L

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???

L

xii...

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

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

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)

L

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.

L

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

L

tenta colocar isso no começo da jsp:

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

(modifica o @page que vc jah tem)

L

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>
L

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

L

caro Lucas fiz conforme o sugerido,

mas nada ocorreu tambem.

Oq esta acontecendo será???

L

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!
          }  
      }
L

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

L

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?

L

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.

L

tenta formatar o PC e refaz o teste ahuahuhua
brincadeira…

que zica em ?

L

Lavieri

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

nem sei oq dizer rsss.

Abraço

L

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

L

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!

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

tem algo estranho ai na sua lógica

L

Obs.: provavelmente o seu problema é o seguinte

} catch(HibernateException ex) {  
              result.forwardTo(HibernateTratadaroDeExceptionController.class).logicaTratadoraDeEx(ex);  
          }

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;
          }
L

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

L

qqer coisa no interceptor faz:

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

e vê se funciona

L

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

M

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:

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

M

Com esse Interceptor que repliquei acima, as mensagens de erro ficam muito ruins para retornar para um usuário.
Implementei de uma outra forma e gostaria da opinião do pessoal.

Na minha DAO, tenho o seguinte método.

public boolean salva(Produto produto) { Transaction tx = sessao.beginTransaction(); try { sessao.persist(produto); tx.commit(); } catch (HibernateException e) { tx.rollback(); return false; } return true; }

A Controller que utiliza o método acima utiliza um esquema mais ou menos assim.

public void adiciona(final Produto produto, List<UploadedFile> imagem) { ... final boolean save = dao.salva(produto); validador.checking(new Validations() {{ that(save == false, "Produto", "erro.produto.save"); }}); validador.onErrorForwardTo(ProdutosController.class).novo(); .... }

Claro, eu gostaria de utilizar o Inteceptor… Mas devido ao problema do post anterior não está sendo possível.

Obrigado novamente.

G

Mr_Arthur, você não precisa mais fazer isso. Se você usar o Vraptor 3.2 vocẽ pode usar o Exception Handler.

public void adiciona(final Produto produto, List<UploadedFile> imagem) { result.on(HibernateException.class).forwardTo(this).algumaCoisa(); if (true) { throw new HibernateException("teste"); } }

Assim sempre que der uma HibernateException o Vraptor irá fazer um forward para o método algumaCoisa. Na tela você recebe os seguintes atributos (padrão servlets):

javax.servlet.error.exception: a exception gerada javax.servlet.error.exception_type: classe da exception javax.servlet.error.message: mensagem de erro javax.servlet.error.request_uri: endereço da página que gerou o erro

Ou seja, na página você pode fazer algo assim para exibir a mensagem de erro:

M

Muito bom, obrigado Garcia.

Agora seguinte… Hoje eu inicio minhas transações por meio das sessões do hibernate que são injetadas nas minhas DAOs.
Se uma HibernateException vai ser lançada no método persist(), onde eu vou dar o rollback?

Valeu.

M

Resolvido.

Reposta tá no:
Site do VRaptor -> Menu Documentação -> Opção 11. Componentes Utilitários Opcionais.

Valeu.

M

garcia-jj:
Mr_Arthur, você não precisa mais fazer isso. Se você usar o Vraptor 3.2 vocẽ pode usar o Exception Handler.

public void adiciona(final Produto produto, List<UploadedFile> imagem) { result.on(HibernateException.class).forwardTo(this).algumaCoisa(); if (true) { throw new HibernateException("teste"); } }

E sobre utilizar os hibernate providers do vraptor…
O commit() só vai acontecer quando passar denovo pelo HibernateTransactionInterceptor.
Como eu faço tratamento de redirecionamento para minhas páginas ou lógicas?

Obrigado pelas respostas.

G

E sobre utilizar os hibernate providers do vraptor…
O commit() só vai acontecer quando passar denovo pelo HibernateTransactionInterceptor.

Isso é uma afirmação? Se sim está errado, pois o vraptor fará um commit sempre que a página for processada com sucesso.

É aquela velha história de não ler os docs. Em Result há um método chamado redirectTo.

L

não precisa tratar redirecionamentos, o commit vai acontecer sempre q der tudo certo

M

garcia-jj:
E sobre utilizar os hibernate providers do vraptor…
O commit() só vai acontecer quando passar denovo pelo HibernateTransactionInterceptor.

Isso é uma afirmação? Se sim está errado, pois o vraptor fará um commit sempre que a página for processada com sucesso.

É aquela velha história de não ler os docs. Em Result há um método chamado redirectTo.

Garcia, sobre o redirecionamento do Result, eu (acho que) sei como funciona. Eu sempre procuro ler a documentação antes de vir com uma dúvida… E desculpe pela afirmação que eu fiz errado, eu achei que funcionava assim. (depois vou ver se ponho o src do vraptor no meu eclipse)
Estava com uma dúvida sobre redirecionamento após acontecer um erro.
Eu estava usando um “result.on().redirectTo” para fazer o redirecionamento apartir de uma nova requisição do cliente e conseguir que minha url ficasse correta.
Porém o erro estava estourando na minha tela ainda…
Mudei para “forwardTo” e agora minha lógica é redirecionada corretamente e a jsp é exibida.
O problema é a url que fica como se tivesse passado no result.redirectTo do final do meu método.
É melhor eu mostrar o código já que eu não estou conseguindo me expressar direito com palavras. :frowning:

@Path("/produtos") public void adiciona(final Produto produto, List<UploadedFile> imagem) { result.on(Exception.class).redirectTo(ProdutosController.class).novo(); // exibe stacktrace no browser. se mudar para forwardTo lógica executa corretamente. ... dao.salva(produto); ... atribuiImagensAoProduto(produto, imagem); ... result.redirectTo(ProdutosController.class).lista(); // Se é feito um forwardTo no result.on() lá em cima, a url fica como se fosse essa lógica. }

Cara, desculpa qualquer incomodo…
Não quero ser taxado por essa “velha história” que você disse aí.

Valeu.

M

Sempre que tudo der certo em que momento? após a chamada do persist?

Valeu.

G

Mr_Arthur, acho que eu não havia entendido tua pergunta. Agora com a explicação entendi melhor. :thumbup:

Basicamente o Vraptor faz sempre o commit. Porém acontecendo erros ele fará um rollback, independente de você fazer redirect ou forward. E isso é interno, ou seja, você não precisa fazer intervenção alguma.

Para tratar os erros eu uso sempre o forward, pois assim eu mantenho os mesmos parametros para poder renderizar a tela corretamente. Se a sua preocupação é apenas com a URL que fica lá, acho que a URL é o menos importante, pois creio que ter sua tela renderizada corretamente é o mais importante.

L

a stacktrace que acontece é do que? da HibernateException ou da linha do result.on(…)?

o commit é executado sempre ao final da requisição, se não deu nenhuma exception

M

Garcia,

OK, um forward realmente se encaixa melhor.
Obrigado.

Mas ainda sobre a stacktrace do redirect…
Segue:

@Path("/produtos") public void adiciona(final Produto produto, List<UploadedFile> imagem) { result.on(Exception.class).redirectTo(ProdutosController.class).novo(); // REDIRECT ... dao.salva(produto); ... atribuiImagensAoProduto(produto, imagem); ... result.redirectTo(ProdutosController.class).lista(); }

public void salva(Produto produto) { if (true) { throw new HibernateException("teste"); } sessao.persist(produto); }

Stacktrace no browser:

org.hibernate.HibernateException: teste br.com.bsbmotos.dao.ProdutoDao.salva(ProdutoDao.java:27) br.com.bsbmotos.controller.ProdutosController.adiciona(ProdutosController.java:81) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:69) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90) br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.interceptor.multipart.CommonsUploadMultipartInterceptor.intercept(CommonsUploadMultipartInterceptor.java:102) br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70) br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92) br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56) br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Log VRaptor apartir da chamada ao método adiciona.

15:58:49,750 DEBUG [ExecuteMethodInterceptor] Invoking ProdutosController.adiciona(Produto, List) 15:58:58,128 DEBUG [DefaultExceptionMapper] find for exception class org.hibernate.HibernateException 15:58:58,128 DEBUG [DefaultExceptionMapper] found exception mapping: class java.lang.Exception -> br.com.caelum.vraptor.core.ExceptionRecorder@7e17a4 15:58:58,128 DEBUG [ExceptionHandlerInterceptor] handling exception class org.hibernate.HibernateException 15:58:58,128 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultLogicResult' 15:58:58,130 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'objenesisProxifier' 15:58:58,131 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultRouter' 15:58:58,133 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletRequestProvider' 15:58:58,134 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletResponseProvider' 15:58:58,135 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'br.com.caelum.vraptor.ioc.spring.SpringBasedContainer' 15:58:58,136 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultPathResolver' 15:58:58,138 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultFormatResolver' 15:58:58,139 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletRequestProvider' 15:58:58,144 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultAcceptHeaderToFormat' 15:58:58,144 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultFormatResolver' 15:58:58,144 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultPathResolver' 15:58:58,145 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultTypeNameExtractor' 15:58:58,146 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultLogicResult' 15:58:58,146 DEBUG [DefaultLogicResult ] redirecting to class ProdutosController 15:58:58,156 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProdutosController.novo() as [] 15:58:58,156 DEBUG [DefaultLogicResult ] redirecting to /bsbmotos/produtos/novo 15:58:58,156 DEBUG [CommonAnnotationBeanPostProcessor] Invoking destroy method on bean 'sessionCreator': public void br.com.caelum.vraptor.util.hibernate.SessionCreator.destroy() 15:58:58,156 DEBUG [VRaptor ] VRaptor ended the request

Isso aê, valeu.

L

acho que é por causa de uma linha no vraptor:

result.include("javax.servlet.error.status_code", 500);

qdo o servidor vê esse atributo já trata a requisição como sendo erro 500, por isso não funciona o redirect, só o forward

M

Mas uma vez eu por aqui.
Estou tendo problemas usando o Exception Handler... Não estou conseguindo ser redirecionado caso aconteça a exception e sou mandado pra tela servidor com stacktrace.
Minha classe Produto tem relacionamento @OneToOne unirecional com a classe Marca.
Quando eu vou deletar uma Marca, se existe algum produto que contenha essa marca uma exception é lançada.
Estou fazendo algo errado?

Segue o código e stacktrace:
@Delete
@Path("/categorias/{id}")
public void remove(Integer id) {
	result.on(Exception.class).forwardTo(MarcasController.class).lista(); // Exception.class para testes

	Marca marca = dao.carrega(id);
	dao.exclui(marca); // deletando marca que é apontada por algum produto.
	result.redirectTo(MarcasController.class).lista();
}
15/10/2010 00:45:38 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
	at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	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:53)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	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.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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.BatchUpdateException: Entrada em lote 0 delete from tb_marca where id_marca=10 foi abortada. Chame getNextException para ver a causa.
	at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 37 more
L

só pra testes, tire essa linha:

result.redirectTo(MarcasController.class).lista();

e crie o remove.jsp com qqer coisa

G
Lucas Cavalcanti:
acho que é por causa de uma linha no vraptor:
result.include("javax.servlet.error.status_code", 500);

qdo o servidor vê esse atributo já trata a requisição como sendo erro 500, por isso não funciona o redirect, só o forward

Vou fazer uns testes aqui. Se for mesmo esse o problema basta estender ExceptionHandlerInterceptor e sobrescrever reportException:

@Component
@RequestScoped
public class CustomExceptionHandlerInterceptor
    extends ExceptionHandlerInterceptor {

    protected void reportException(Exception e) {
    	Throwable rootCause = Throwables.getRootCause(e);

        // add error attributes compliance with servlet spec
        result.include("javax.servlet.error.exception", rootCause);
        result.include("javax.servlet.error.exception_type", rootCause.getClass());
        result.include("javax.servlet.error.message", rootCause.getMessage());
        result.include("javax.servlet.error.request_uri", request.getRequestURI());
    }
}
M

Lucas, o comportamento foi o mesmo.

Garcia, fiz examente o o que você passou. Comportamento foi o mesmo também. (edit: usando o forwardTo)

Obrigado aê.

L

eu sei qual é o problema…

coloca isso no meio do método da lógica:

if (true) throw new RuntimeException("xx");

ele provavelmente vai fazer o redirecionamento corretamente…

o q acontece é q a exception da BatchUpdate só acontece no commit da transação, q está fora da lógica…

e a ordem em que o ExceptionHandlerInterceptor está registrado não suporta exceptions nos interceptors registrados pela sua aplicação =’(

G

Hmm, bem lembrado. Ou seja, pode ser feito também um flush no momento do update/insert/delete. Eu faço isso, mesmo usando EJB com JTA sem problemas, pois do contrário perco minhas validações do BeanValidator.

M

Utilizei o session.flush() após o session.delete().
Registrou exception antes de sair da minha lógica mas ainda não consegui usar o exception handler para redirecionar.

01:41:49,438 DEBUG [ExecuteMethodInterceptor] Invoking MarcasController.remove(Integer) 01:41:49,866 DEBUG [DefaultExceptionMapper] find for exception class org.hibernate.exception.ConstraintViolationException 01:41:49,866 DEBUG [DefaultExceptionMapper] found exception mapping: class java.lang.Exception -> br.com.caelum.vraptor.core.ExceptionRecorder@93432 01:41:49,868 DEBUG [ExceptionHandlerInterceptor] handling exception class org.hibernate.exception.ConstraintViolationException 01:41:49,875 DEBUG [VRaptorApplicationContext] Cache miss for interface br.com.caelum.vraptor.view.LogicResult 01:41:49,876 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultLogicResult' 01:41:49,878 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'objenesisProxifier' 01:41:49,878 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultRouter' 01:41:49,879 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletRequestProvider' 01:41:49,880 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletResponseProvider' 01:41:49,881 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'br.com.caelum.vraptor.ioc.spring.SpringBasedContainer' 01:41:49,881 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultPathResolver' 01:41:49,882 DEBUG [DefaultListableBeanFactory] Creating instance of bean 'defaultFormatResolver' 01:41:49,883 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'httpServletRequestProvider' 01:41:49,883 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultAcceptHeaderToFormat' 01:41:49,883 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultFormatResolver' 01:41:49,883 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultPathResolver' 01:41:49,884 DEBUG [DefaultListableBeanFactory] Returning cached instance of singleton bean 'defaultTypeNameExtractor' 01:41:49,884 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'objenesisProxifier' 01:41:49,884 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'defaultRouter' 01:41:49,884 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'httpServletRequestProvider' 01:41:49,884 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'httpServletResponseProvider' 01:41:49,885 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'br.com.caelum.vraptor.ioc.spring.SpringBasedContainer' 01:41:49,885 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'defaultPathResolver' 01:41:49,885 DEBUG [DefaultListableBeanFactory] Autowiring by type from bean name 'defaultLogicResult' via constructor to bean named 'defaultTypeNameExtractor' 01:41:49,891 DEBUG [DefaultListableBeanFactory] Finished creating instance of bean 'defaultLogicResult' 01:41:49,894 DEBUG [DefaultLogicResult ] Executing MarcasController.lista() 01:41:49,897 DEBUG [CommonAnnotationBeanPostProcessor] Invoking destroy method on bean 'sessionCreator': public void br.com.caelum.vraptor.util.hibernate.SessionCreator.destroy() 16/10/2010 01:41:49 org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet default threw exception net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method lista at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45) at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54) at br.com.caelum.vraptor.core.ExceptionRecorder.replay(ExceptionRecorder.java:81) at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.replay(ExceptionHandlerInterceptor.java:98) 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:53) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90) at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) 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:53) at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56) at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53) 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.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:293) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454) at java.lang.Thread.run(Unknown Source) Caused by: br.com.caelum.vraptor.proxy.ProxyInvocationException: java.lang.reflect.InvocationTargetException at br.com.caelum.vraptor.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:95) at br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56) at br.com.bsbmotos.controller.MarcasController$$EnhancerByCGLIB$$e1e69da9.lista(<generated>) 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 net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38) ... 46 more Caused by: java.lang.reflect.InvocationTargetException 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.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:82) ... 53 more Caused by: org.hibernate.exception.GenericJDBCException: could not execute query at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.doList(Loader.java:2235) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) at org.hibernate.loader.Loader.list(Loader.java:2124) at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1597) at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306) at br.com.bsbmotos.dao.MarcaDao.listarTudo(MarcaDao.java:24) at br.com.bsbmotos.controller.MarcasController.lista(MarcasController.java:45) ... 58 more

Muito obrigado.

G

Tem um could not execute query, ou seja, aparentemente algo com o Hibernate.

O que você tem no método br.com.bsbmotos.dao.MarcaDao.listarTudo?

M

Garcia, sobre o erro, ainda creio que deva ser eu tentando deletar uma marca que está relacionada com um produto.
EDIT: Sei disso pois quando deleto o produto que tem aquela marca, consigo deletar a marca em seguida tranquilamente.

public List<Marca> listarTudo() { return this.sessao.createCriteria(Marca.class).addOrder(Order.asc("destaque")).list(); }

M

Ainda não tenho solução para isso.
Se alguém souber de algo aê, por favor.

Obrigado!

L

Então, Mr_Arthur,

geralmente vc não consegue deletar um registro se tem outro registro relacionado a ele…

ou seja, se tem um produto relacionado a uma marca, vc não pode deletar essa marca…

se vc quiser deletar só a marca vc vai ter que fazer algo do tipo:

  • selecione todos os produtos que são dessa marca
  • sete a marca como null nesses produtos
  • delete a marca

se outras entidades se relacionam com marca, vc tem que fazer a mesma coisa…

outra coisa q vc tem que ver é se faz sentido ter um produto sem marca

M

Lucas, obrigado pela resposta.

Agora seguinte, não há um problema com o Exception Handler?
A exception acontece no momento em que eu faço o flush na minha dao. A dao é chamada dentro da lógica da minha Controller.
O redirecionamento para a minha lógica não deveria acontecer?

Obrigado.

G

Arthur, não sei bem se isso é um erro no exception handler. Tenho usado ele em alguns projetos meus e tem funcionando bem. Pode ser que você tenha pego algum caso bem atípico, talvez alguma nested-bizarre exception, já que o hibernate adora fazer isso.

Vou fazer um teste aqui em uma aplicação real para ver se consigo reproduzir o erro.

L

se a exception acontece antes do result.redirectTo deveria estar funcionando…

se acontece depois do result.redirectTo não vai funcionar

M

Lucas Cavalcanti:
se a exception acontece antes do result.redirectTo deveria estar funcionando…

se acontece depois do result.redirectTo não vai funcionar

Ah cara, então deve ser isso.
Eu estou colocando na inicialização de cada método.
Achei que era tipo um aviso.
“Olhá, se acontecer essa exception vai pra lá.” e não “Olhá, aconteceu essa exception? vai pra lá.”

Vou testar, valeu!

M

Pessoal, sem sucesso ainda.
Testei de diversas formas...

@Delete
@Path("/categorias/{id}")
public void remove(Integer id) {
	result.on(Exception.class).forwardTo(MarcasController.class).lista(); // antes de exclui()

	Marca marca = dao.carrega(id);
	dao.exclui(marca);
	result.redirectTo(MarcasController.class).lista();
}
@Delete
@Path("/categorias/{id}")
public void remove(Integer id) {
	Marca marca = dao.carrega(id);
	dao.exclui(marca);

	result.on(Exception.class).forwardTo(MarcasController.class).lista(); // depois de exclui()

	result.redirectTo(MarcasController.class).lista();
}

E dentro da DAO, para cada teste acima, após o delete utilizei e não utilizei o flush().
Garcia, vou esperar sua resposta sobre sua simulação...

Obrigado!

L

a exception está acontecendo na linha dao.exclui(marca) mesmo? Não é no commit da transação?

M

Isso Lucas,
está acontecendo na hora que eu faço o session.flush() após o session.delete() dentro do método exclui(marca).

Debugando usando o eclipse, imediatamente após a execução do flush(), o modo debug me abre a ExecuteMethodInterceptor. E assim eu encerro meu fluxo pressionando F8.

É isso aê.

Obrigado!

G

Mr_Arthur, dá para fazer um teste criando esse componente aqui?

@RequestScope @Intercepts
public class CustomHibernateTransactionInterceptor extends HibernateTransactionInterceptor {

	private final Session session;

	public HibernateTransactionInterceptor(Session session) {
		this.session = session;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
		Transaction transaction = null;
		try {
			transaction = session.beginTransaction();
			stack.next(method, instance);
			transaction.rollback();
		}
	}
}
M

quando eu pegar o notebook (estou no trabalho, nem dá aqui),
faço imediatamente.

Obrigado!

M

Seguite... O erro mudou.
Segue o interceptor que o garcia me pediu para adicionar. (tirei o do vraptor do que tava no provider)

A classe:
@RequestScoped
@Intercepts
public class CustomHibernateTransactionInterceptor extends HibernateTransactionInterceptor {

	private final Session session;

	public CustomHibernateTransactionInterceptor(Session session) {
		super(session);
		this.session = session;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method, Object instance) {
		Transaction transaction = null;
		System.out.println("*** Begin transaction ***");
		try {
			transaction = session.beginTransaction();
			stack.next(method, instance);
			System.out.println("*** rollback ***");
			transaction.rollback();
		} catch (Exception e) {
			System.out.println("*** Exception e ***");
			e.printStackTrace();
		}
	}
}
O log:
00:42:30,001 DEBUG [VRaptor             ] VRaptor received a new request
00:42:30,004 DEBUG [DefaultRequestExecution] executing stack  DefaultRequestExecution
00:42:30,077 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
00:42:30,078 DEBUG [DefaultResourceTranslator] trying to access /marcas/10
00:42:30,079 DEBUG [VRaptorRequest      ] Setting id with [10]
00:42:30,079 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: MarcasController.removeMarcasController.remove(Integer)]
00:42:30,082 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
00:42:30,083 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
00:42:30,089 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor CustomHibernateTransactionInterceptor
*** Begin transaction ***
00:42:30,092 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
pastaImagens: D:\Documents\Desenvolvimento\workspaces\vraptor_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\blablaproject_head\anexos
00:42:30,100 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor
00:42:30,272 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
00:42:30,285 DEBUG [AsmBasedTypeCreator ] Trying to make class for MarcasController$remove$683715837$1
00:42:30,309 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for MarcasController.remove(Integer) as [id]
00:42:30,309 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [Id]
00:42:30,309 DEBUG [AsmBasedTypeCreator ] Method for field 'Id' being defined for type Ljava/lang/Integer;
00:42:30,312 DEBUG [AsmBasedTypeCreator ] Methods: [public java.lang.Integer MarcasController$remove$683715837$1.getId(), public void MarcasController$remove$683715837$1.setId(java.lang.Integer)]
00:42:30,312 DEBUG [AsmBasedTypeCreator ] Fields: [private java.lang.Integer MarcasController$remove$683715837$1.Id_]
00:42:30,312 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: MarcasController.removeMarcasController.remove(Integer)]
00:42:30,336 DEBUG [OgnlParametersProvider] Applying id with [10]
00:42:30,387 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.converter.IntegerConverter
00:42:30,399 DEBUG [OgnlParametersProvider] Applying _method with [DELETE]
00:42:30,411 DEBUG [OgnlParametersProvider] cant find property for expression _method ignoring
00:42:30,412 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for MarcasController.remove(Integer) as [id]
00:42:30,412 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: MarcasController.removeMarcasController.remove(Integer)] are [10]
00:42:30,414 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
00:42:30,417 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
00:42:30,417 DEBUG [ExecuteMethodInterceptor] Invoking MarcasController.remove(Integer)
00:42:36,161 DEBUG [DefaultExceptionMapper] find for exception class org.hibernate.exception.ConstraintViolationException
00:42:36,161 DEBUG [DefaultExceptionMapper] found exception mapping: class java.lang.Exception -> br.com.caelum.vraptor.core.ExceptionRecorder@277f6a
00:42:36,165 DEBUG [ExceptionHandlerInterceptor] handling exception class org.hibernate.exception.ConstraintViolationException
00:42:36,176 DEBUG [VRaptorApplicationContext] Cache miss for interface br.com.caelum.vraptor.view.LogicResult
00:42:36,203 DEBUG [DefaultLogicResult  ] Executing MarcasController.lista()
*** Exception e ***
net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method lista
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at br.com.caelum.vraptor.core.ExceptionRecorder.replay(ExceptionRecorder.java:81)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.replay(ExceptionHandlerInterceptor.java:98)
	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:53)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.blablaproject.infra.CustomHibernateTransactionInterceptor.intercept(CustomHibernateTransactionInterceptor.java:28)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	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:53)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	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.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:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
	at java.lang.Thread.run(Unknown Source)
Caused by: br.com.caelum.vraptor.proxy.ProxyInvocationException: java.lang.reflect.InvocationTargetException
	at br.com.caelum.vraptor.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:95)
	at br.com.caelum.vraptor.proxy.AbstractCglibProxifier$2.intercept(AbstractCglibProxifier.java:56)
	at br.com.blablaproject.controller.MarcasController$$EnhancerByCGLIB$$4c0c21df.lista(<generated>)
	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 net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	... 46 more
Caused by: java.lang.reflect.InvocationTargetException
	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.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:82)
	... 53 more
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.doList(Loader.java:2235)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
	at org.hibernate.loader.Loader.list(Loader.java:2124)
	at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:118)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1597)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
	at br.com.blablaproject.dao.MarcaDao.listarTudo(MarcaDao.java:24)
	at br.com.blablaproject.controller.MarcasController.lista(MarcasController.java:45)
	... 58 more
Caused by: org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1548)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1316)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:191)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:452)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:351)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:255)
	at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
	at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
	at org.hibernate.loader.Loader.doQuery(Loader.java:697)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.doList(Loader.java:2232)
	... 65 more
00:42:36,211 DEBUG [VRaptor             ] VRaptor ended the request
Cara... Segundo o log, parece que ele detectou a exception tudo certinho... Segue a parte do log:
00:42:30,417 DEBUG [ExecuteMethodInterceptor] Invoking MarcasController.remove(Integer)
00:42:36,161 DEBUG [DefaultExceptionMapper] find for exception class org.hibernate.exception.ConstraintViolationException
00:42:36,161 DEBUG [DefaultExceptionMapper] found exception mapping: class java.lang.Exception -> br.com.caelum.vraptor.core.ExceptionRecorder@277f6a
00:42:36,165 DEBUG [ExceptionHandlerInterceptor] handling exception class org.hibernate.exception.ConstraintViolationException
00:42:36,176 DEBUG [VRaptorApplicationContext] Cache miss for interface br.com.caelum.vraptor.view.LogicResult
00:42:36,203 DEBUG [DefaultLogicResult  ] Executing MarcasController.lista()
Porém eu ainda sou redirecionado para uma jsp com stacktrace de erro que veio do servidor: :/
java.sql.BatchUpdateException: Entrada em lote 0 delete from tb_marca where id_marca=10 foi abortada. Chame getNextException para ver a causa.
	org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2530)
	org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1317)
	org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:350)
	org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2592)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
	br.com.blablaproject.dao.GenericDao.exclui(GenericDao.java:30)
	br.com.blablaproject.controller.MarcasController.remove(MarcasController.java:115)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:57)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:90)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.blablaproject.infra.CustomHibernateTransactionInterceptor.intercept(CustomHibernateTransactionInterceptor.java:28)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:44)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:81)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:53)
	br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:70)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:56)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Obrigado!

Criado 6 de março de 2010
Ultima resposta 20 de out. de 2010
Respostas 73
Participantes 5