オプション1(ベストプラクティスであるため、推奨され
ます):構成ファイルをリファクタリングWEB-INF
し、共通部分(統合テストからもアクセスする)をに移動しsrc/main/resources/
ます。次に、テスト固有の構成ファイルを書き込みますsrc/test/resources/
(テストコンテキストをアセンブルするためにいくつかの異なる構成ファイルをインポートするだけでよい場合はsrc/main
、これをスキップして、@ContextConfiguration
できれば使用してください)。
オプション2(ハック):次
のような参照を使用します:
@ContextConfiguration("file:src/main/webapp/WEB-INF/dataSource.xml")
オプション3(ハック):
Mavenプロジェクトがある場合は、テストの実行中に追加のクラスパス要素としてmaven-surefire-plugin
宣言するように(テストフェーズで使用)を構成できます。src/main/webapp
後者の2つのオプションは、下のファイルsrc/main/webapp
がクラスパス上にあるとは想定されていないため、ハックと見なされます。
今詳細な説明:
これらのファイルをそのまま参照できない理由classpath:/WEB-INF/*.xml
は、実際にはクラスパス上にないためです。Webアプリがどのようにパッケージ化されているか、そして何がクラスパスに正確に含まれるかを理解することが重要です。デフォルトのMavenプロジェクト構造を想定すると:
- からのJavaクラスはコンパイル後に
src/main/java
移動します。/WEB-INF/classes
src/main/resources
からのリソース/WEB-INF/classes
も同様です。
- プロジェクトの依存関係はに移動し
/WEB-INF/lib
ます。
- あなたが持っているものはすべて(パッケージのルート)に
src/main/webapp
行きます。/
これは、もちろん、からのすべてのファイルがsrc/main/webapp/WEB-INF
に移動することを意味します。/WEB-INF
知っておくべき最も重要なことは、クラスパスには、の/WEB-INF/classes
jarごとに1つのエントリしか含まれないということ/WEB-INF/lib
です。したがって、これら2つの場所の外部にあるリソースは、クラスローダーからは完全に見えません。これは、直下 のxml構成ファイルにも当てはまります。/WEB-INF
そのため、参照classpath:/WEB-INF/dataSource.xml
は機能しません。
クラスパスから到達できない場合、これらのxml構成ファイルはSpringによってどのようにロードされるのでしょうか。答えは簡単です。(ユニット/統合テストだけを実行するのではなく)Webアプリケーションを起動すると、ServletContext
(サーブレットAPIからの実際のクラス)へのアクセスを提供するサーブレットコンテナで実行されるため、ServletContext.getResourceAsStream()
これらをロードするために使用されます。ファイル。理解するための鍵は、このメソッドのjavadocからの次の引用です。
このメソッドは、クラスローダーを使用するjava.lang.Class.getResourceAsStreamとは異なります。このメソッドを使用すると、サーブレットコンテナは、クラスローダーを使用せずに、任意の場所からサーブレットでリソースを利用できるようになります。
申し訳ありませんが、これは長すぎますが、それが全体の話です...