2

タイトルが長くて申し訳ありませんが、他に具体的に言う方法がわかりませんでした。

私が持っているもの:

Hibernate Interceptor を使用して Hibernate 呼び出しをインターセプトし、監査ログ エントリを追加する監査証跡モジュールを開発しています。これはうまくいきます。

私の Web アプリケーションは Struts2 と Spring を使用しています。私の Hibernate Interceptor は、Spring の ApplicationContext にアクセスできます。

私が欲しいもの:

各監査ログ エントリに「意味を与える」必要があるため、プレゼンテーション レイヤー (Struts) で行われた各リクエストのパラメーター (文字列メッセージなど) を Spring の ApplicationContext に渡す必要があります。そうすれば、Hibernate Interceptor のパラメーターにアクセスして、それに応じてログに記録できます。

例:

  1. Struts - ユーザー詳細ページ: setPassword(user1, mypass)、「User1 がパスワードを変更しました」という新しいメッセージを生成します。
  2. このメッセージは、Spring の ApplicationContext に注入されます。
  3. Hibernate Interceptor は「更新」をインターセプトし、Spring の ApplicationContext から前のメッセージを取得して、メッセージを含む新しいログ エントリを作成します。

これを行う方法を知っていますか?

4

2 に答える 2

1

Hibernate はどのフィールドがダーティかを既に認識していると思っていましたが、記憶違いである可能性があります。いずれにせよ、これが最善の方法であるかどうかはわかりません。

私は別のアプローチを取り、Hibernate インターセプターに依存するのではなく、サービス/サービス呼び出し自体でこれを行います。IMO の Hibernate インターセプターは、「概念的な」アプリケーションでは低すぎます。サービス OTOH は、既にビュー レイヤーとデータ レイヤーの間のブリッジとして機能しています。

あなたは(a)すでにサービス層と「手動​​で」対話する必要があり、(b)Hibernateインターセプターはアプリケーションに対する自明なビューを持っていないため(IMOもそうすべきですが、それは私の意見です:)私は監査を抽象化のレイヤーに移動します。

(これは答えやリダイレクトではありませんが、コメントするには長すぎました。)

于 2011-09-16T13:31:03.230 に答える
1

Struts2 Spring プラグインを使用して両方を統合すると仮定します。これを使用する場合、Struts アクション、インターセプターは Spring オブジェクト ファクトリによって構築されるため、Spring Bean の依存性注入の恩恵を受けることができます。

Spring 側では、(私は試していませんが) 1 つの方法で機能します:次のようなリクエスト スコープ Beanを使用します。

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

Spring コンテナーは、myBeanすべての HTTP 要求に対して Bean 定義を使用して、Bean の新しいインスタンスを作成します。

Struts 側 (アクションまたはカスタム インターセプター) で、Spring Bean を注入して情報を設定できるようになりました。Bean に状態(指定した情報) があることに注意する必要があります。

Hibernate 側では、コンテキストからも Bean を取得し、情報を読み取ってログに記録できるようになりました。

別の方法として、ここで説明されている LOGBack ロギング フレームワークのように、MDC (Mapped Diagnostic Context) を使用することを検討してください。MDC を使用すると、 のような値を非常に簡単にMDC.put("myKey", "myValue")設定して、 のようなカスタム パターンでログに記録できます%X{myKey}。このソリューションは、Hibernate インターセプターをまったくバイパスします。

于 2011-09-16T20:23:02.453 に答える