3

アノテーション駆動型の構成を持つ春の webapp があります。

すべてのコントローラ、リポジトリは自動配線されています。

Spring Security を統合するとき、別の security-app.xml を定義しました。UserDetailsS​​ervice を実装する LoginUserService という Service を作成しました。これで、このクラスのメソッド loadUserByUsername() メソッドが認証のために呼び出されます。

このクラスには、UserRepository に対する自動配線された依存関係があります。この自動配線された依存関係は null であることが判明しました。これを修正するために、アノテーション駆動構成を有効にし、コンポーネント スキャン構成にリポジトリ クラスのパッケージ名を追加します。

このソリューションは、ここでも説明されています 。カスタム ユーザーの詳細を使用した春のセキュリティ

しかし、問題は、UserRepository に @PersistenceContext アノテーションが付けられた EntityManager フィールドがあることです。春のセキュリティ構成では、UserRepository を見つけることはできますが、エンティティ マネージャーを見つけることはできません。ここで新しい EntityManagerFactory を作成する必要がありますか? 私のアプリケーションに 2 つの永続化ユニットが作成されると思いますか?

元のサーブレット xml で作成された UserRepository に自動配線された依存関係を挿入するにはどうすればよいですか?

アップデート

これについては、ここで簡単に説明します: https://stackoverflow.com/a/7078395/161628

しかし、標準的な詳細な回答が私にとってより役立つと思います。

アップデート

実行時に ApplicationContext を使用して UserRepository を取得するのはどうですか?

if (userRepository == null) {
    userRepository = ApplicationContextProvider.getApplicatonContext().getBean(UserRepository.class);
}

Spring の ApplicationContext.getBean が悪いと見なされるのはなぜですか?

4

1 に答える 1

1

編集:DispatcherServlet の構成で宣言した Bean は、contextConfigLocation 構成ファイルで宣言またはコンポーネント スキャンする任意の Bean で使用できません。したがって、この場合、DispatcherServlet 用にロードする構成ファイルで JPA 構成をセットアップしている場合、セキュリティ構成で宣言する Bean にそれを配線する方法はありません。そのような「コア」Bean 構成 (データソース構成、データベース接続プール構成、JPA/Hibernate 構成、リポジトリ/サービス コンポーネント スキャンなど) を、contextConfigLocation を介してロードする構成ファイルに移動する必要があります。その後、その内容はセキュリティ Bean と MVC Bean の両方で利用できるようになります。一般的には、DispatcherServlet 構成 (コントローラー、ビュー、リクエスト ハンドラーなど) に MVC 固有の Bean のみをロードすることが考えられます。リクエスト スコープ Bean など)。こうすることで、MVC コードと非 MVC コードを明確に分離し、MVC コードから「コア」コードへの一方向の依存関係のみを確保し、「コア」コード内の MVC コードに依存しないようにします。これにより、コードがよりモジュール化され、「コア」コードを他の方法、特に単体テストで再利用しやすくなります。

(元のコメント テキストは、セキュリティ構成が contextConfigLocation または他の場所にある場合、どのように読み込まれるかについて質問していました。)

于 2013-05-09T06:03:58.027 に答える