Envers自定义修订监听器

时间:2011-09-20 13:44:54

标签: java hibernate-envers

我在Tomcat环境中使用Hibernate Envers。它工作正常。但是我需要能够添加更改要审核的数据的用户的用户名。这可以通过实现您自己的RevisionEntity版本来完成。然后,您还必须实现一个自定义RevisionListener,它将填充您要审核的额外信息。我需要审核已更改要审核的数据的用户名。在文档中,它是如何使用Seam执行此操作的示例。在他们调用的RevisionListener中:

Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");

获取用户名。在我的项目中,我们将项目拆分为数据库和Web的单独模块。我需要在我的数据库模块中实现我的custum修订监听器才能获得当前登录的用户名。我无法将RevisionListener移动到Web包,并从数据库模块引入对Web模块的依赖。如何以在自定义RevisionListener中同时处理多个用户的方式获取当前用户名?

最好的解决方案是在大多数容器中都能使用的解决方案。

2 个答案:

答案 0 :(得分:1)

我可以理解你想要限制模块之间的耦合。我过去使用Spring和JSF做过这个。我在他们自己的项目中有数据访问代码,我的Web项目依赖于数据访问罐。

我在另一个了解Hibernate类和JSF API的项目中编写了监听器。我能够使用JSF API查找登录用户。

这样,Web应用程序依赖于数据和侦听器项目。数据访问项目不需要知道它的使用位置,即使发生审计也是如此。并且侦听器在Web项目中配置。

答案 1 :(得分:0)

这听起来像是上下文和依赖注入(CDI)的工作。您可以定义一个接口,例如ClientInfo,它具有getUsername和getIPAddress抽象方法。然后在您的表示层中创建该接口的具体实现,比如JSFClientInfo,它使用FacesContext来获取用户名和IP地址。业务层组件可以简单地使用@Inject ClientInfo。

可悲的是,我认为您必须实际使用服务定位器,因为CDI不维护org.hibernate.envers.RevisionListener生命周期。