[VRaptor] Exception Handling não funcionando

Olá pessoas,

Um projeto utilizando VRaptor + Hibernate caiu de para-quedas na minha mão e estou com uma dificuldade, acredito que simples, para capturar uma exception lançada.
Já dei uma estudada na FJ28, já busquei em vários tópicos aqui e nada do que esta aqui ajudou muito.

Enfim,

Tenho no meu controller, que estende de um controller genérico, um método save que chama o método save de seu pai. Este por sua vez chama o método add de uma implementação de repository genérico.

Controller: SistemaController extends GenericController

	@Post("/sistema/save")
	@Override
	public void save(Sistema sistema) {
		//em caso de qualquer exceção no repositório redireciona para o método save (GET)
		getResult().on(Exception.class).forwardTo(this).saveError();
		super.save(sistema);
	        addSucessMessage("Inclusão efetuada com sucesso");
		getResult().redirectTo("/sistema/novo");
	}

GenericController implements Controller

@Override
	public void save(E object) {
		validator.validate(object);
		validator.onErrorUsePageOf(this).form();
		repository.add(object);
	}

RepositoryHibernateImpl implements Repository

	@Override
	public void add(E object) throws RepositoryExceptionHandler {
		session.save(object);
	}

Quando tento, propositalmente, inserir um sistema que já esta cadastrado na base, não consigo pegar a exceção em lugar nenhum. Nem com a forma especificada na documentação “getResult().on(‘Exceção lançada’)”

Pelo debug o código passa normalmente por essa linha e não faz nada e lança a mensagem de erro na tela:


org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:50)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)


root cause 

java.sql.BatchUpdateException: ORA-00001: unique constraint (SSO.SISTEMA_PK) violated

	oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
	oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10698)
	org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:50)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)

Sou novo no VRaptor e ainda estou tentando entender o controle de exceções utilizando o Hibernate.

Só para adicionar informação, meu web.xml esta assim:

<context-param>
        <param-name>br.com.caelum.vraptor.packages</param-name>
        <param-value>
        	br.com.caelum.vraptor.util.hibernate,
			br.com.caelum.vraptor.http,
			br.com.caelum.vraptor.http.iogi,
			br.com.caelum.vraptor.util.extjs
		</param-value>
    </context-param>

Qualquer ajuda será de grande valia!
Abraços.

Ele chega a redirecionar pra .forwardTo(this).saveError();

?

Não, passa direto pelo método como se nada tivesse acontecido.

Achei uma discussão parecida aqui também que o cara implementou um interceptor e conseguia pegar a exceção, daí fiz o mesmo mas acabei caindo no mesmo problema que o cara, ele só cai na exception do interceptor depois de já ter mandado o resultado de volta para a página. Daí como no meu controller (SistemaController) no método save ele tem um método para adicionar uma mensagem de sucesso, ele volta para o view com as duas mensagens, a de sucesso do meu controller e a de erro do exception do meu interceptor…

Já estou em casa agora e só tenho o código no trabalho, mas o que precisaria basicamente era que o result.on(…) interrompesse o fluxo do meu save…

Pelo que entendi o erro ocorre quando o hibernate tenta comitar a transação que esta sendo controlada pelo hibernate com o vraptor (acho que é isso) e o hibernate só comita/finaliza depois do resultado ser devolvido…

Quando coloco um breakpoint nesta linha do meu controller

getResult().redirectTo("/sistema/novo"); 

ele passa por ela e cai no exception depois disso…

Tentei também passar o controle da transação para o spring mas sem sucesso, desisti por que como peguei o barco andando, teria que modificar uma boa parte da arquitetura montada.

Vi em algum outro post que você pediu ao cara para ele usar na anotação do interceptor alguma coisa que funcionasse entre a finalização do resultado e o envio desse resultado para a view… mas fiquei sem tempo para testar isso…
Amanhã posto o o código do meu interceptor.

Mas se tiver alguma ideia já será bem vinda!
Obrigado pela atenção.

então vulpios, não dá pra parar o método no result.on(Exception) pq a exception não aconteceu ainda…

ela só vai acontecer no commit da transação que se vc usou o pacote util.hibernate, acontece ao final do método mesmo.

O ideal seria controlar a transação no método do dao mesmo, e vc poderia usar o spring transaction pra isso.

não é necessário modificar toda a arquitetura pra isso, não.

  • remova o pacote util.hibernate
  • registre no applicationContext.xml a sessionFactory do spring, e a configuração do spring transaction
  • crie uma componentFactory parecida com a HibernateSession desse post:
    https://groups.google.com/forum/#!msg/caelum-vraptor/yYFM2vVL0fQ/B2W9RGgCAoMJ
  • Configure o openSessionInViewFilter do spring
  • coloque o @Transactional do spring onde precisar de transação.

Valeu Lucas

Entendi o problema… Vou tentar modificar o controle da transação para o spring utilizando os passos que você falou!
Quando terminar ou se der algum problema posto aqui!

Pensei numa solução mais drástica também (isso foi depois de muito apanhar junto com desespero :slight_smile: ), do tipo, quando, no interceptor eu caísse na exceção, via reflection e mais alguma anotação criada em um método de tratamento de erros do controller genérico ou do próprio controller eu fazer o redirecionamento… Dá para fazer isso mas vai ficar um bicho esse código…

Vou tentar com o spring!

Valeu pela ajuda!
Grande abraço.

essa solução do interceptor não vai funcionar se vc já tiver usado o result no controller…

tipo se vc fizer um result.redirectTo(…)… no controller, já era.

outra solução que eu já vi alguém fazer é adicionar um redirect listener num interceptor que commita a transação se acontecer um redirect… assim dá erro antes de dar o redirect e o exception handler funciona

  • receba um MutableResponse e a Session no construtor e faça no método intercept, antes do stack.next:
response.addRedirectListener(new RedirectListener() {
			
			@Override
			public void beforeRedirect() {
				session.getTransaction().commit();
			}
		});

Também estou com um problema parecido, mas a causa não é a mesma de cima.

Olha só, eu tenho um controller com os dois métodos:

	@Get(&quot;/login&quot;)
	public void login(){
		System.out.println(&quot;login&quot;);
	}
	
	public void logar(Pessoa pessoa){
		result.on(SistemaException.class).redirectTo(this).login();
		
		throw new SistemaException(&quot;teste&quot;);		
	}

Não teoria, era pra SEMPRE nesse caso acionar o método login e ir para a view correspondente, correto? Mas o que acontece é a exception estourar no jsp, e o login não é executado. SistemaException é uma classe que herda de RuntimeException.

Pelos logs do vraptor, o metodo login deveria estar sendo executado. Segue o log:

11:36:33,804 DEBUG [VRaptor             ] VRaptor received a new request
11:36:33,815 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ResourceLookupInterceptor
11:36:33,815 DEBUG [DefaultResourceTranslator] trying to access /pessoa/logar
11:36:33,816 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: PessoaController.logarPessoaController.logar(Pessoa)]
11:36:33,833 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
11:36:33,842 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
11:36:33,844 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
11:36:33,847 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
11:36:33,859 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
11:36:33,859 DEBUG [JstlLocalization    ] couldn't find message bundle, creating an empty one
11:36:33,859 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for PessoaController.logar(Pessoa) as [pessoa]
11:36:33,860 DEBUG [OgnlParametersProvider] Applying senha with [dasddsadas]
11:36:33,860 DEBUG [OgnlParametersProvider] Applying email with [dasdas]
11:36:33,860 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: PessoaController.logarPessoaController.logar(Pessoa)] are [pojo.Pessoa@1f]
11:36:33,871 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
11:36:33,871 DEBUG [ExecuteMethodInterceptor] Invoking PessoaController.logar(Pessoa)
11:36:33,872 DEBUG [CglibProxifier      ] a proxy for interface br.com.caelum.vraptor.Result is created as class br.com.caelum.vraptor.Result$$EnhancerByCGLIB$$240db731
11:36:33,872 DEBUG [CglibProxifier      ] a proxy for class controllers.PessoaController is created as class controllers.PessoaController$$EnhancerByCGLIB$$a27d4728
11:36:33,873 DEBUG [DefaultExceptionMapper] find for exception class exceptions.SistemaException
11:36:33,873 DEBUG [DefaultExceptionMapper] found exception mapping: class exceptions.SistemaException -&gt; br.com.caelum.vraptor.core.ExceptionRecorder@1fb80c9
11:36:33,873 DEBUG [ExceptionHandlerInterceptor] handling exception class exceptions.SistemaException
11:36:33,881 DEBUG [DefaultLogicResult  ] redirecting to class PessoaController
11:36:33,881 DEBUG [CglibProxifier      ] a proxy for class controllers.PessoaController is created as class controllers.PessoaController$$EnhancerByCGLIB$$a27d4728
11:36:33,881 DEBUG [DefaultLogicResult  ] redirecting to /Projetos2R/login
11:36:33,881 DEBUG [VRaptor             ] VRaptor ended the request

Alguma sugestão?

você não pode usar redirect, do jeito que está o vraptor hoje, só forward.

isso pq redirect muda o status da requisição pra 302, e se deu exception o status sempre vira 500.

Com forward o método é executado, mas a exceção continua aparecendo na tela. Isso está certo né? Para que isso não acontecesse eu deveria usar um try catch com o validator, ou simplesmente colocar minha mensagem de erro no catch usando o include. É isso?

ele não foi pro login.jsp?

não deveria fazer try…catch não…

Então Lucas,

Modifiquei aqui para que o spring controlasse a transaction. Mas apareceu um outro probleminha. primeiro vou pastar como ficou o código.

web.xml

<context-param>
        <param-name>br.com.caelum.vraptor.packages</param-name>
        <param-value>
        	<!-- br.com.caelum.vraptor.util.hibernate, -->
			br.com.caelum.vraptor.http,
			br.com.caelum.vraptor.http.iogi,
			br.com.caelum.vraptor.util.extjs
		</param-value>
    </context-param>
	
	<context-param>
	    <param-name>br.com.caelum.vraptor.encoding</param-name>
	    <param-value>UTF-8</param-value>
	</context-param>
	
	<listener>  
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
	</listener>  
	
	<filter>  
	    <filter-name>openSessionInViewFilter</filter-name>  
	    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
	    <init-param>    
	        <param-name>sessionFactoryBeanName</param-name>    
	        <param-value>sessionFactory</param-value>    
	    </init-param>    
	</filter>  
	  
	<filter-mapping>  
	    <filter-name>openSessionInViewFilter</filter-name>  
	    <url-pattern>/*</url-pattern>  
	</filter-mapping>

applicationContext.xml

	<tx:annotation-driven />
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="configLocation">
			<value>classpath:/hibernate.cfg.xml</value>
		</property>
	</bean>

criei essa classe como você instruiu
ComponentSessionFactory.java

package br.com.unimedfortaleza.sabius.tecnologia.sso.util;

import java.lang.reflect.Method;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import net.vidageek.mirror.dsl.Mirror;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.SessionFactoryUtils;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.ComponentFactory;
import br.com.caelum.vraptor.proxy.MethodInvocation;
import br.com.caelum.vraptor.proxy.Proxifier;
import br.com.caelum.vraptor.proxy.SuperMethod;

@Component
public class ComponentSessionFactory implements ComponentFactory<Session> {
	private final SessionFactory factory;
	private final Proxifier proxifier;
	private Session session;

	public ComponentSessionFactory(SessionFactory factory, Proxifier proxifier) {
		this.factory = factory;
		this.proxifier = proxifier;
	}

	@PostConstruct
	public void open() {
		this.session = proxifier.proxify(Session.class,
				new MethodInvocation<Session>() {
					public Object intercept(Session proxy, Method method,
							Object[] args, SuperMethod superMethod) {
						
						Session springSession = SessionFactoryUtils
													.doGetSession(factory, true);
						
						return new Mirror().on(springSession)
										   .invoke()
										   .method(method)
										   .withArgs(args);
					}
				});
	}

	public Session getInstance() {
		return this.session;
	}

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

Meu controller
SistemaController.java

	@Post("/sistema/save")
	@Override
	public void save(Sistema sistema) {
		getResult().on(RepositoryExceptionHandler.class).forwardTo(this).saveError();
		super.save(sistema);
		addSucessMessage("Inclusão efetuada com sucesso");
		getResult().redirectTo("/sistema/novo");
	}
	
	@Post
	public void saveError(){
		addErrorMessage("Erro ao salvar os dados para o novo Sistema");
		getResult().redirectTo("/sistema/novo");
	}

o GenericController eu mudei a assinatura do método dando throws na exceção

	@Override
	public void save(E object) throws RepositoryExceptionHandler {
		validator.validate(object);
		validator.onErrorUsePageOf(this).form();
		repository.add(object);
	}

E o meu RepositoryHibernateImpl eu mudei apenas a assinatura do método para lançar a exceção
tirei um monte de métodos que não são necessários aqui no post

package br.com.unimedfortaleza.sabius.tecnologia.repository.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.transform.Transformers;
import org.springframework.transaction.annotation.Transactional;

import br.com.caelum.vraptor.ioc.Component;
import br.com.unimedfortaleza.sabius.tecnologia.repository.Repository;
import br.com.unimedfortaleza.sabius.tecnologia.repository.exception.RepositoryExceptionHandler;

@Component
public class RepositoryHibernateImpl<E> implements Repository<E> {
	
	protected Session session;
	protected Criteria criteria;
	protected Class<E> clazz;
	
	private static final Integer MAX_RESULT = 10;
	private static final Integer FIRST_RESULT = 0;
	
	public RepositoryHibernateImpl(Session session) {
		this.session = session;		
	}
	
	/* Para qualquer select na base de dados mesmo que seja um simples select, será necessario chamar o find antes. */
	@SuppressWarnings({ "unchecked" })
	@Override
	public Repository<E> find(Class clazz) {
		this.criteria = session.createCriteria(clazz);
		this.clazz = clazz;
		return this;
	}
	
	@Transactional
	@Override
	public void add(E object) throws RepositoryExceptionHandler {
		try {
			session.save(object);
			session.getTransaction().commit(); //ADICIONEI O TRY/CATCH e O COMMIT DA TRANSAÇÃO AQUI
		} catch (Exception e) {
			throw new RepositoryExceptionHandler(e);
		}
	}

	
}

Agora ele executa tudo certinho e manda para o método saveError do controller o problema é que ele não faz o redirect.
Ele passa por essas linhas do método save do SistemaController

getResult().on(RepositoryExceptionHandler.class).forwardTo(this).saveError();
super.save(sistema);

e depois vai para essa linha do saveError

addErrorMessage("Erro ao salvar os dados para o novo Sistema");

Quando executa a próxima linha do método que é o redirect ( getResult().forwardTo("/sistema/novo"); )
ele dá esse erro

13:20:28,055 DEBUG [ResourceLookupInterceptor] Method POST is not allowed for requested URI. Allowed Methods are [GET]
br.com.caelum.vraptor.http.route.MethodNotAllowedException: Method POST is not allowed for requested URI. Allowed Methods are [GET]
	at br.com.caelum.vraptor.http.route.DefaultRouter.routesMatchingUriAndMethod(DefaultRouter.java:110)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:83)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:66)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:49)
	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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at br.com.caelum.vraptor.view.DefaultPageResult.forwardTo(DefaultPageResult.java:105)
	at br.com.caelum.vraptor.core.AbstractResult.forwardTo(AbstractResult.java:34)
	at br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController.saveError(SistemaController.java:88)
	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.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:85)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController$$EnhancerByCGLIB$$c83e326e.saveError(<generated>)
	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 net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	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:100)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:73)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	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.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	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:127)
	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:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
13:20:28,055 DEBUG [VRaptor             ] VRaptor ended the request

Daí para frente eu fui testando outras coisas… a mais invocada de todas é que se eu tiro essa linha do redirect do saveError e crio uma página saveError.jsp
ele vai certinho para ela sem mostrar erro nenhum (dentro desta saveError.jsp eu tenho só um texto “aqui”)

E aí, tem alguma ideia do que pode ser?
Mais uma vez obrigado pela atenção.

Se eu tiro o session.getTransaction().commit
do meu repositoryHibernateImpl ele me dá outra exceção antes de sair da chamada do super.save() do meu SistemaController

olha a exceção

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into SSO.SISTEMA (NOME_SISTEMA, VERSAO, ID) values (?, ?, ?)]; constraint [SSO.SISTEMA_PK]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


root cause 

org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; SQL [insert into SSO.SISTEMA (NOME_SISTEMA, VERSAO, ID) values (?, ?, ?)]; constraint [SSO.SISTEMA_PK]; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637)
	org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:374)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	$Proxy65.add(Unknown Source)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.GenericController.save(GenericController.java:64)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController.save(SistemaController.java:80)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


root cause 

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:374)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	$Proxy65.add(Unknown Source)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.GenericController.save(GenericController.java:64)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController.save(SistemaController.java:80)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)


root cause 

java.sql.BatchUpdateException: ORA-00001: unique constraint (SSO.SISTEMA_PK) violated

	oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
	oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10698)
	org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
	org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
	org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
	org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:374)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	$Proxy65.add(Unknown Source)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.GenericController.save(GenericController.java:64)
	br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController.save(SistemaController.java:80)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.NoCacheInterceptor.intercept(NoCacheInterceptor.java:64)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.unimedfortaleza.sabius.tecnologia.sso.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

não volta o controle para o meu controller

[quote=Lucas Cavalcanti]ele não foi pro login.jsp?

não deveria fazer try…catch não…[/quote]

Na URL continua /pessoa/logar, o que está certo já que foi um forward, mas dá erro 500 com a minha exception na tela, e não o conteúdo do jsp.

Edite: Mas o método login do controller foi executado.

vulpios, se vc usa o @Transactional vc não deveria mais mexer com as transações, o proprio spring vai fazer isso…

e ele não foi pro throw new RepositoryExceptionHandler(e); pq a transação é commitada fora do método, logo depois que ele acaba.

renatocustodio, vc tá com a última versão do vraptor? a 3.4.1?

Beleza, eu entendi isso, o problema é que a exceção vai para o limbo e eu não consigo capturá-la mais…
por isso que coloquei o commit “na tora” (rsrs) para ver se ele devolvia a exceção para mim e foi o que aconteceu

Tirando o commit do método add dá aquela exceção que postei logo depois e não volta para o controller

como eu pegaria ela agora?

Valeu,
abraços.

tenta fazer um session.flush() depois do save

Criei um projeto e branco usando o blank project e funcionou, mas no antigo ainda não, mesmo atualizando o vraptor (estava no 3.4 antes). Mas pelo menos agora eu já sei que é algo que eu fiz, então ficou mais fácil de achar. Vou dar uma analisada aqui.

Edite: Descobri que o meu problema está sendo causado pelo filtro do sitemesh. Se eu retirá-lo, funciona. Agora é descobrir como deixar ele funcionando.

Edite 2: Resolvi o problema. No web.xml, a configuração do meu filtro do sitemesh estava assim:

  &lt;filter&gt;
    &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
    &lt;filter-class&gt; com.opensymphony.module.sitemesh.filter.PageFilter 
		&lt;/filter-class&gt;
  &lt;/filter&gt;

Que é a forma como funcionando quando uso o struts 2. Com o vraptor, em vez de PageFilter uso o SiteMeshFilter, ficando assim:

&lt;filter&gt;
  &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;
  &lt;filter-class&gt;com.opensymphony.sitemesh.webapp.SiteMeshFilter&lt;/filter-class&gt;
&lt;/filter&gt;

Edite 3: Eu me precipitei. O que eu postei não resolve o problema não :frowning:

Edite 4: Depois de apanhar muito, pelo visto não é possível mesmo. :cry:

Lucas,

Coloquei o session.flush e agora a exceção voltou para o meu controller mas voltou a acontecer o mesmo problema.
Quando ele executa o save do controller e vai até o meu dao (repositoryHibernate) quando volta, ele executa meu método saveError do controller mas quando chama o
getResult().forwardTo("/sistema/novo") mostra esse erro

No console do eclipse aparece esse erro, mas na tela é mostrado o erro do unique constraint que foi o erro que forcei.

08:48:34,952 DEBUG [ResourceLookupInterceptor] Method POST is not allowed for requested URI. Allowed Methods are [GET]
br.com.caelum.vraptor.http.route.MethodNotAllowedException: Method POST is not allowed for requested URI. Allowed Methods are [GET]
	at br.com.caelum.vraptor.http.route.DefaultRouter.routesMatchingUriAndMethod(DefaultRouter.java:110)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:83)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:66)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:49)
	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.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at br.com.caelum.vraptor.view.DefaultPageResult.forwardTo(DefaultPageResult.java:105)
	at br.com.caelum.vraptor.core.AbstractResult.forwardTo(AbstractResult.java:34)
	at br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController.saveError(SistemaController.java:88)
	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.view.DefaultLogicResult$1.intercept(DefaultLogicResult.java:85)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at br.com.unimedfortaleza.sabius.tecnologia.sso.controller.SistemaController$$EnhancerByCGLIB$$3f0e89f6.saveError(<generated>)
	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 net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	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:100)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:73)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	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.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	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:127)
	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:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)

Valeu!
Muito obrigado pela atenção.

o erro é pq vc está dentro de uma requisição POST e tá fazendo um forward pra uma lógica que só aceita GET…

se a idéia é só mostrar a página, sem executar o método, use o:

result.on(....).use(Results.page()).of(this).novo();

substituindo o this pelo controller, se necessário…

se vc precisar executar o método, ele precisa aceitar post também =(

Lucas,

Um amigo meu me ajudou aqui (o Markus Reichel) olhando o código fonte do VRraptor (3.4.0) no interceptor das exceptions e verificou que tem um problema na lógica. Quando acontece um erro o interceptor verifica se é uma exceção da qual estou tratando ( result.on(BlaException.class)… ) quando ele não acha este tratamento ele retorna null e lança o erro 500 no response o que causa a mensagem de erro na tela do Browser, até aqui beleza, o problema é que quando ele ACHA a minha exception ele faz exatamente a mesma coisa, lança o erro 500 no response e aí estoura a exceção na tela ignorando o forward/redirect

Segue o trecho de código da classe que ele verificou:
br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.java

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

        // add error attributes compliance with servlet spec
        result.include("javax.servlet.error.status_code", 500); //>>>>>>>>>>>>>>>>>>>>>>> SEMPRE SETA O HTTP ERROR CODE 500 <<<<<<<<<<<<<<<<<<<<
        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());
    }

    protected boolean replay(Exception e) {
        ExceptionRecorder<Result> exresult = exceptions.findByException(e);

        //QUANDO NÃO EXISTE O TRATAMENTO ELE RETORNA FALSE E NO MÉTODO QUE CHAMOU ESSE CARA ROLA O THROWS
        if (exresult == null) { 
		return false;
	}

        reportException(e); // >>>>>>>>>>>> O PROBLEMA <<<<<<<<<<<<<< SEMPRE ELE CHAMA ESSE CARA QUE SETA O ERRO 500

        logger.debug("handling exception {}", e.getClass());
        exresult.replay(result);

        return true;
    }

Então o Reichel reimplementou esse trecho de código do interceptor extendendo esta classe, segue o a classe implementada que funciona para os dois casos, quando o erro é tratado e quando não é tratado.


import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.ExceptionMapper;
import br.com.caelum.vraptor.core.ExceptionRecorder;

@Intercepts
public class ExceptionHandlerInterceptor extends br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor{

    private final ExceptionMapper exceptions;
    
    private final Result result;

    protected static final Logger logger = LoggerFactory.getLogger(ExceptionHandlerInterceptor.class);
    
	public ExceptionHandlerInterceptor(ExceptionMapper exceptions,
			Result result, HttpServletRequest request) {
		super(exceptions, result, request);
		this.exceptions = exceptions;
		this.result = result;
	}

	@Override
    protected boolean replay(Exception e) {
        logger.debug("handling exception {}", e.getClass());
        ExceptionRecorder<Result> exresult = exceptions.findByException(e);
        if (exresult == null) {
        	reportException(e);
		} else {
	        exresult.replay(result);
		}
        return true;
    }

	public ExceptionMapper getExceptions() {
		return exceptions;
	}

	public Result getResult() {
		return result;
	}
	
}

Verificamos o código da versão 3.4.1 e esta igual.
Usando essa implementação de interceptor passou a funcionar belezinha. Verifique por favor ou explique-nos o porquê desse status code 500 ser setado
sempre quando há o tratamento da exception.

Abraço
Valeu para a ajuda.