【问题标题】:Envers custom revision listenerEnvers 自定义修订监听器
【发布时间】:2011-11-21 02:53:02
【问题描述】:

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

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

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

最好的解决方案是适用于大多数容器的解决方案。

【问题讨论】:

    标签: java hibernate-envers


    【解决方案1】:

    我可以理解您想要限制模块之间的耦合。我过去曾使用 Spring 和 JSF 完成此操作。我在他们自己的项目中有数据访问代码,而我的 Web 项目依赖于数据访问 jar。

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

    这样,Web 应用程序依赖于数据和侦听器项目。数据访问项目不需要知道它在哪里使用,即使正在进行审计。并且监听器是在web项目中配置的。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 2012-01-04
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多