我很抱歉这个长标题,但我知道没有其他具体方法。
我有什么:
我正在开发一个Audit Trail模块,它使用Hibernate Interceptor来拦截Hibernate调用并添加审计日志条目。这很好。
我的Web应用程序使用Struts2和Spring。我的Hibernate Interceptor可以访问Spring的ApplicationContext。
我想要的是什么:
因为我想对每个审计日志条目“赋予意义”,所以我需要将在表示层(Struts)上发出的每个请求上的参数(例如String消息)传递给Spring的ApplicationContext。这样,我可以访问Hibernate Interceptor中的参数并相应地记录它。
示例:
你知道怎么做吗?
答案 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拦截器。