2011-09-16 29 views
1

對於長標題,我很抱歉,但我不知道具體的其他方法。將呈現(Struts)參數傳遞給(Spring)ApplicationContext並在Hibernate攔截器中使用它們

我有什麼:

我正在開發一個使用Hibernate的攔截器攔截Hibernate調用,並添加審計日誌條目的審計跟蹤模塊。這工作正常。

我的web應用程序使用Struts2和Spring。我的Hibernate Interceptor可以訪問Spring的ApplicationContext。

我想要什麼:

因爲我想「賦予意義」每個審覈日誌條目,我需要在在表現層提出的每個請求傳遞參數(如字符串消息)(Struts的) ,Spring的ApplicationContext。這樣,我可以訪問Hibernate Interceptor中的參數並相應地記錄它。

例子:

  1. Struts的 - 用戶詳細信息頁:setPassword(USER1,爲mypass),產生一個新的 消息 「用戶1改變了他/她的密碼」。
  2. 此消息注入Spring的ApplicationContext。
  3. Hibernate Interceptor攔截「update」並從Spring的ApplicationContext獲取前一條消息,並使用消息創建一個新的日誌條目。

你知道該怎麼做?

回答

1

我假設你使用Struts2的春季插件既整合。當使用這個時,你的Struts動作,攔截器是由Spring對象工廠構建的,因此可以受益於Spring bean的依賴注入。

在彈簧側單向可以(我沒試過)工作:使用request scoped beans這樣的:

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

Spring容器使用myBean bean定義創建bean的新實例針對每個HTTP請求。

在Struts端(您的動作或自定義攔截器),您現在可以注入Spring bean並設置您的信息。您必須注意,您的bean現在有狀態(您提供的信息)。

在Hibernate方面,您現在應該可以從上下文獲取bean並讀取信息並記錄下來。

作爲另一種選擇,您可能會考慮使用MDC(Mapped Diagnostic Context),如here for the LOGBack logging framework所述。使用MDC,您可以非常輕鬆地將值設置爲MDC.put("myKey", "myValue"),並使用像%X{myKey}這樣的自定義模式進行記錄。這個解決方案完全可以繞過你的Hibernate攔截器。

+0

謝謝,這真的很有幫助。我成功地使用了「請求」範圍。 – anahnarciso

1

我以爲Hibernate已經知道哪些字段很髒,但我可能會記錯。無論如何,我不確定這是做這件事的最好方法。

我會採取不同的方法,並在服務/服務調用本身而不是依賴Hibernate攔截器。 IMO的Hibernate攔截器在「概念」應用程序中太低。 OTOH服務已經成爲視圖層和數據層之間的橋樑。由於您(a)已經需要「手動」與服務層進行交互,並且(b)Hibernate攔截器沒有進入應用程序的簡單視圖(也不應該是IMO),但是這只是我的意見:)我會把審計提上一層抽象。

(我知道這是不太答案,重定向的,但它是一個評論太長。)

+0

這不是一個選項,但無論如何謝謝你。 – anahnarciso

+1

@anahnarciso即使你使用AOP,它當然也是更清潔的。將應用範圍的行爲與特定的實現聯繫起來,我們幾乎總是一個糟糕的主意,並且使測試變得更加困難。 –

相關問題