5

Tomcat 環境で Hibernate Envers を使用しています。それは正常に動作します。ただし、監査対象のデータを変更したユーザーのユーザー名を追加できる必要があります。これは、独自のバージョンの RevisionEntity を実装することで実行できます。RevisionListener次に、監査する追加情報を入力するカスタムも実装する必要があります。監査対象のデータを変更したユーザー名を監査する必要があります。ドキュメントでは、Seam でこれを行う方法の例です。彼らがRevisionListener呼び出すで:

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

ユーザー名を取得します。私のプロジェクトでは、プロジェクトをデータベースと Web 用の個別のモジュールに分割しました。現在ログインしているユーザー名を取得できるようにするには、データベース モジュールにカスタム リビジョン リスナーを実装する必要があります。を Web パッケージに移動しRevisionListenerて、データベース モジュールから Web モジュールへの依存関係を導入することはできません。カスタム RevisionListener で同時にログインしている複数のユーザーを処理する方法で現在のユーザー名を取得するにはどうすればよいですか?

最善の解決策は、ほとんどのコンテナーで機能するものです。

4

2 に答える 2

1

モジュール間の結合を制限したいのは理解できます。過去にSpringとJSFを使用してこれを行いました。独自のプロジェクトにデータ アクセス コードがあり、Web プロジェクトはデータ アクセス jar に依存していました。

Hibernate クラスと JSF API について知っている別のプロジェクトでリスナーを作成しました。JSF API を使用して、ログインしているユーザーを見つけることができました。

そうすれば、Web アプリはデータとリスナー プロジェクトに依存します。データ アクセス プロジェクトは、それがどこで使用されているか、また監査が行われているかどうかを知る必要はありません。そして、リスナーは Web プロジェクトで構成されます。

于 2011-09-20T13:57:02.017 に答える
0

これは、コンテキストと依存性注入(CDI)の仕事のように聞こえます。getUsernameおよびgetIPAddress抽象メソッドを持つClientInfoなどのインターフェースを定義できます。次に、プレゼンテーション層で、FacesContextを使用してユーザー名とIPアドレスを取得するJSFClientInfoなどのインターフェイスの具体的な実装を作成します。ビジネスレイヤーコンポーネントは、@InjectClientInfoを使用するだけです。

残念ながら、org.hibernate.envers.RevisionListenerのライフサイクルはCDIによって維持されていないため、代わりに実際にサービスロケーターを使用する必要があると思います。

于 2011-09-21T16:39:43.857 に答える