我正在尝试使用Envers进行条件审核,所以根据documentation,我关闭了默认的Envers事件监听器,而是注册了我自己的子类。
现在我正在尝试使用AuditReader读取审计表,但它会抛出一个异常,说明Envers(默认)侦听器未正确注册。
如果我在某些情况下只打开/关闭审核,我还能以某种方式使用默认的审核阅读器吗?我不是在改变表格,也不是在我的监听器中手动执行任何操作,我只是检查一些条件,然后从超类中调用方法。
更新 事实证明,要使AuditReader工作,监听器需要实现EnversListener接口。问题解决了。
答案 0 :(得分:0)
事实证明,Envers尝试从分配给Hibernate会话的侦听器中读取AuditReader。如果您的插入后监听器未实现AuditEventListener,则需要手动构建AuditReader。这就是我在我们的解决方案中实现它的方式,基于Envers的实现:
private AuditReader getAuditReader(final Session session) {
SessionImplementor sessionImpl;
if (!(session instanceof SessionImplementor)) {
sessionImpl = (SessionImplementor) session
.getSessionFactory().getCurrentSession();
} else {
sessionImpl = (SessionImplementor) session;
}
return new AuditReaderImpl(this.versionConfig, session, sessionImpl);
}
输入Session是一个Hibernate会话。需要以某种方式提供versionConfig变量。可以在自定义侦听器的init函数中创建此Envers配置对象,如下所示:
public final void initialize(final Configuration configuration) {
versionConfig = AuditConfiguration.getFor(configuration);
}