2

很抱歉标题太长了,但我不知道其他方法可以具体说明。

是)我有的:

我正在开发一个审计跟踪模块,它使用 Hibernate 拦截器来拦截 Hibernate 调用并添加审计日志条目。这工作正常。

我的 Web 应用程序使用 Struts2 和 Spring。我的 Hibernate 拦截器可以访问 Spring 的 ApplicationContext。

我想要的是:

因为我想为每个审计日志条目“赋予意义”,所以我需要将在表示层(Struts)发出的每个请求的参数(例如字符串消息)传递给 Spring 的 ApplicationContext。这样,我可以访问 Hibernate Interceptor 中的参数并相应地记录它。

例子:

  1. Struts - 用户详细信息页面:setPassword(user1, mypass),生成一条新消息“User1 更改了他/她的密码”。
  2. 该消息被注入到 Spring 的 ApplicationContext 中。
  3. Hibernate Interceptor 拦截“更新”并从 Spring 的 ApplicationContext 中获取之前的消息,使用该消息创建一个新的日志条目。

你知道怎么做吗?

4

2 回答 2

1

我以为 Hibernate 已经知道哪些字段是脏的,但我可能记错了。无论如何,我不确定这是解决此问题的最佳方法。

我会采取不同的方法并在服务/服务调用本身中执行此操作,而不是依赖 Hibernate 拦截器。IMO Hibernate 拦截器在“概念”应用程序中太低了。OTOH 服务已经充当了视图层和数据层之间的桥梁。

由于您(a)已经需要“手动”与服务层交互,并且(b)Hibernate 拦截器对应用程序没有简单的看法(也不应该是 IMO,但这只是的意见:) 我'会将审计移到抽象层上。

(我知道这不是一个答案和一个重定向,但评论太长了。)

于 2011-09-16T13:31:03.230 回答
1

我假设您使用 Struts2 Spring 插件来集成两者。使用它时,您的 Struts 操作、拦截器由 Spring 对象工厂构建,因此可以从 Spring bean 的依赖注入中受益。

在 Spring 方面,一种方法可以(我没有尝试过)工作:使用请求范围的 bean,如下所示:

<bean id="myBean" class="com.foo.MyBean" scope="request"/>

myBeanSpring 容器通过为每个 HTTP 请求使用 bean 定义来创建 bean 的新实例。

在 Struts 方面(您的操作或自定义拦截器)您现在可以注入 Spring bean 并设置您的信息。您必须知道您的 bean 现在具有状态(您提供的信息)。

在 Hibernate 方面,您现在应该能够从上下文中获取 bean 并读取信息并记录它。

作为替代方案,您可能会考虑使用 MDC(映射诊断上下文),就像这里为 LOGBack 日志记录框架描述的那样。使用 MDC,您可以非常轻松地放置类似的值MDC.put("myKey", "myValue")并使用自定义模式(如%X{myKey}. 该解决方案将完全绕过您的 Hibernate 拦截器。

于 2011-09-16T20:23:02.453 回答