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

Passing presentation (Struts) parameters to (Spring) ApplicationContext and use them in Hibernate Interceptor

很抱歉,我的标题很长,但是我不知道有其他具体方法。

我所拥有的:

我正在开发一个Audit Trail模块,该模块使用Hibernate Interceptor拦截Hibernate呼叫并添加审核日志条目。效果很好。

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

我想要什么:

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

示例:

  • Struts-用户详细信息页面:setPassword(user1,mypass),生成一个
    新消息"用户1更改了他/她的密码"。
  • 该消息被注入到Spring的ApplicationContext中。
  • Hibernate Interceptor截获" update "并从Spring \\的ApplicationContext获取上一条消息,并使用该消息创建一个新的日志条目。
  • 您知道该怎么做吗?


    我假设您使用Struts2 Spring插件将两者集成在一起。使用此方法时,您的Struts动作,拦截器是由Spring对象工厂构建的,因此可以从依赖于Spring Bean的注入中受益。

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

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

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

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

    在Hibernate端,您现在还应该能够从上下文中获取Bean并读取信息并将其记录。

    作为替代方案,您可能考虑使用MDC(映射的诊断上下文),如此处针对LOGBack日志记录框架所述。使用MDC,您可以轻松地输入MDC.put("myKey","myValue")之类的值,并使用诸如%X{myKey}之类的自定义模式对其进行记录。此解决方案将完全绕过您的Hibernate拦截器。


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

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

    由于您(a)已经需要"手动"与服务层进行交互,并且(b)Hibernate拦截器对应用程序没有任何看法(也不是IMO,应该如此),但这只是我的看法:)我将把审计工作移到抽象层。

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