Vraptor + Spring + Hibernate Envers

Bom dia galera. Estou com tentando fazer auditoria em um projeto que estou desenvolvendo e descobri o hibernate envers.
Estou com problema para fazer ele funcionar com vraptor e spring.
Alguém tem um tutorial ou um exemplo de como fazer isso?

Agradeço.

Ninguém?

Depois de pesquisar muito, juntei toda a bagagem e configurei o applicationContext.xml do Spring. Ficou assim:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<tx:annotation-driven transaction-manager="transactionManager" />

	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
		<property name="dataSource" ref="defaultDataSource" />
	</bean>
	
	<bean id="auditListener" class="org.hibernate.envers.event.AuditEventListener" />
		
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="defaultDataSource" />
		<property name="packagesToScan" value="br.com.rastrus.**.domain" />
		<property name="configLocation">
			<value>classpath:/hibernate.cfg.xml</value>
		</property>
		<property name="eventListeners">
	        <map>
	            <entry key="post-insert" value-ref="org.hibernate.envers.event.AuditEventListener" />
	            <entry key="post-update" value-ref="org.hibernate.envers.event.AuditEventListener" />
	            <entry key="post-delete" value-ref="org.hibernate.envers.event.AuditEventListener" />
	            <entry key="pre-collection-update" value-ref="org.hibernate.envers.event.AuditEventListener" />
	            <entry key="pre-collection-remove" value-ref="org.hibernate.envers.event.AuditEventListener" />
	            <entry key="post-collection-recreate" value-ref="org.hibernate.envers.event.AuditEventListener" />
	        </map>
   		 </property>
	</bean>
</beans>

O problema agora é que eu utilizo o Hibernate 4, que não possui mais o eventListenrs (Hibernate 3.x) e esta dando erro ao rodar o sistema. Alguém sabe como configurar esses eventListeners no Spring para o Hibernate 4?

Consegui “configurar” o Envers. Na verdade mudei pra o Envers 4, anotei minhas classes com @Audited e funcionou. :slight_smile:

O meu problema agora é em customizar a minha informação na revisão, implementando RevisionListener. Não consigo adicionar o usuário da sessão nela. Pode ser algum problema do Envers com o Vraptor, ou com o spring, não sei. Eu inicio a minha aplicação, não aparece nenhum erro, mas também não funciona. Acredito que as classes não estejam sendo chamadas.

Esse é o código:

import javax.persistence.Entity;
import org.hibernate.envers.DefaultRevisionEntity;
import org.hibernate.envers.RevisionEntity;
import br.com.rastrus.arq.domain.User;

@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity extends DefaultRevisionEntity {
	
	private static final long serialVersionUID = 1L;
	
	private User user;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
}
package br.com.rastrus.audit;

import org.hibernate.envers.RevisionListener;
import org.springframework.beans.factory.annotation.Autowired;

import br.com.rastrus.arq.web.SessionData;

public class CustomRevisionListener implements RevisionListener {

	@Autowired
	private SessionData sessionData;
	
	@Override
	public void newRevision(Object revisionEntity) {
		((CustomRevisionEntity) revisionEntity).setUser(sessionData.getUser());
	}
}

Se alguém poder ajudar, agradeço. :smiley:

Problema resolvido. Não estava mapeando a classe de domínio no hibernate.cfg. O problema agora é pegar o usuário da sessão e adicionar na entidade.

Alguém pode ajudar dessa vez?

Tenta usar isso:

UsuarioWeb user = VRaptorRequestHolder.currentRequest().getSession().getAttribute("usuarioWeb");

Supondo que seu componente da sessao eh esse.

Isso soh funciona se a entidade for alterada durante uma request