2011-09-20 65 views
4

我在Tomcat環境中使用Hibernate Envers。它工作正常。不過,我需要能夠添加更改要審計的數據的用戶的用戶名。這可以通過實現您自己的RevisionEntity版本來完成。然後你還必須實現一個定製的RevisionListener,它將填充你想要審覈的額外信息。我需要審覈已更改要審覈的數據的用戶名。在文檔中,它是一個關於如何使用Seam來做到這一點的例子。在RevisionListener他們呼籲:Envers定製修訂監聽器

Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity"); 

要獲得用戶名。在我的項目中,我們將項目拆分爲數據庫和網絡的獨立模塊。我需要在我的數據庫模塊中實現我的custum修訂偵聽器,以便能夠獲取當前登錄的用戶名。我無法將RevisionListener移動到Web包,並從數據庫模塊引入對Web模塊的依賴。我如何以一種方式獲取當前用戶名,這種方式可以處理多個用戶在我的自定義版本監聽器中同時登錄?

最好的解決方案是在大多數容器中工作的解決方案。

回答

1

我可以理解你想限制模塊之間的耦合。過去我使用Spring和JSF完成了這個任務。我在他們自己的項目中有數據訪問代碼,我的Web項目依賴於數據訪問罐。

我在另一個知道Hibernate類和JSF API的項目中編寫了監聽器。我能夠使用JSF API來查找登錄的用戶。

這樣Web應用程序依賴於數據和偵聽器項目。數據訪問項目不需要知道它在哪裏使用,即使正在進行審計。監聽器在Web項目中配置。

0

這聽起來像是上下文和依賴注入(CDI)的工作。您可以定義一個接口,如具有getUsername和getIPAddress抽象方法的ClientInfo。然後在您的表示層中創建該接口的具體實現,例如JSFClientInfo,它使用FacesContext來獲取用戶名和IP地址。業務層組件可以簡單地使用@Inject ClientInfo。

不幸的是,我認爲你不得不實際使用服務定位器,因爲org.hibernate.envers.RevisionListener生命週期不是由CDI維護的。