Pessoal,
Estou implementando auditoria em um sistema que utiliza Struts 2. Resolvi utilizar o Hibernate Envers para a auditoria.
Já segui vários exemplos, mas não consigo fazer funcionar. O erro acontece na classe que implementa RevisionListener.
Nela eu tento pegar os dados do usuário da sessão da seguinte forma:
package tarefas.auditoria;
import java.util.Map;
import org.hibernate.envers.RevisionListener;
import tarefas.modelo.Usuario;
import com.opensymphony.xwork2.ActionContext;
public class AuditoriaListener implements RevisionListener {
@Override
public void newRevision(Object arg0) {
AuditoriaRevEntity auditoriaRevEntity = (AuditoriaRevEntity) arg0;
Map<String, Object> sessao = ActionContext.getContext().getSession();
Usuario usuarioLogado = (Usuario) sessao.get("usuarioLogado");
auditoriaRevEntity.setLogin(usuarioLogado.getLogin());
}
}
É lançada uma exceção na linha 17.
Map<String, Object> sessao = ActionContext.getContext().getSession();
Essa é a saída do console quando passa por esta linha:
11:52:06 ERROR [AssertionFailure] an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
java.lang.NullPointerException
at tarefas.auditoria.AuditoriaListener.newRevision(AuditoriaListener.java:17)
at org.hibernate.envers.revisioninfo.DefaultRevisionInfoGenerator.generate(DefaultRevisionInfoGenerator.java:95)
at org.hibernate.envers.synchronization.AuditProcess.getCurrentRevisionData(AuditProcess.java:124)
at org.hibernate.envers.synchronization.AuditProcess.executeInSession(AuditProcess.java:106)
at org.hibernate.envers.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:155)
at org.hibernate.engine.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:554)
at org.hibernate.engine.ActionQueue.beforeTransactionCompletion(ActionQueue.java:216)
at org.hibernate.impl.SessionImpl.beforeTransactionCompletion(SessionImpl.java:571)
at org.hibernate.jdbc.JDBCContext.beforeTransactionCompletion(JDBCContext.java:250)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:138)
at tarefas.persistence.hibernate.HibernateSessionRequestFilter.doFilter(HibernateSessionRequestFilter.java:40)
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:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Estou utilizando o Struts 2.3.1.2, Hibernate 3.6.10.Final e Tomcat 6.0.24.
Outro detalhe é que o sistema usa o pattern Open Session In View: https://community.jboss.org/wiki/OpenSessionInView
Alguém pode me ajudar? Desde já agradeço!