将表示(Struts)参数传递给(Spring)ApplicationContext并在Hibernate Interceptor中使用它们

时间:2011-09-16 11:32:29

标签: spring hibernate struts2 interceptor applicationcontext

我很抱歉这个长标题,但我知道没有其他具体方法。

我有什么:

我正在开发一个Audit Trail模块,它使用Hibernate Interceptor来拦截Hibernate调用并添加审计日志条目。这很好。

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

我想要的是什么:

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

示例:

  1. Struts - 用户详细信息页面:setPassword(user1,mypass),生成一个 新消息“User1更改了他/她的密码”。
  2. 此消息在Spring的ApplicationContext中注入。
  3. Hibernate Interceptor拦截“update”并从Spring的ApplicationContext获取上一条消息,并使用该消息创建一个新的日志条目。
  4. 你知道怎么做吗?

2 个答案:

答案 0 :(得分:1)

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

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

因为你(a)已经需要“手动”与服务层交互,并且(b)Hibernate拦截器没有对应用程序的简单视图(也不是,IMO,它们应该是,但那只是我的意见:)我会将审计移到一个抽象层。

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

答案 1 :(得分:1)

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

在Spring方面,可以(我还没试过)工作:使用request scoped beans这样:

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

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

在Struts端(你的动作或自定义拦截器),你现在可以注入Spring bean并设置你的信息。您必须知道您的bean现在具有 state (您提供的信息)。

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

作为替代方案,您可能会考虑使用像here for the LOGBack logging framework所述的MDC(映射诊断上下文)。使用MDC,您可以非常轻松地输入MDC.put("myKey", "myValue")之类的值,并使用%X{myKey}等自定义模式记录它。这个解决方案可以绕过你的Hibernate拦截器。