WEB-INFディレクトリにいくつかのXMLファイルがあります。
サーブレットxmlは他のxmlファイルをインポートします。
<import resource="dataSource.xml"/>
<import resource="hibernate.xml"/>
<import resource="beans.xml"/>
Junit4 JukeboxTest
クラスにスプリング設定全体を含めたいです。デフォルトのファイル名を使用して、JukeboxTest-content.xml
ファイルを作成しました。そして最後に、そこに何を置くべきか分かりません...
私はもう試した:
<import resource="/WEB-INF/dataSource.xml"/>
<import resource="/WEB-INF/hibernate.xml"/>
<import resource="/WEB-INF/beans.xml"/>
または
<import resource="classpath:./WEB-INF/dataSource.xml"/>
<import resource="classpath:./WEB-INF/hibernate.xml"/>
<import resource="classpath:./WEB-INF/beans.xml"/>
そして他のいくつかのアイデアがすべて失敗しました。誰かがそれらのファイルにアクセスする方法と、春がそれらのファイルパスをどのように解釈するかを教えてもらえますか?
オプション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
_として参照できない理由は、それらが実際にクラスパス上にないためです。 webappがどのようにパッケージ化されているか、そしてクラスパスで正確に何が終わるかを理解することが重要です。デフォルトのMavenプロジェクト構造を想定:
src/main/Java
_の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
_と、_/WEB-INF/lib
_の各jarごとに1つのエントリのみが含まれることです。したがって、これらの2つの場所の外側のリソースは、クラスローダーからは完全に見えません。これは、XML構成ファイルの直下_/WEB-INF
_にも当てはまります。これが、参照_classpath:/WEB-INF/dataSource.xml
_が機能しない理由です。
クラスパスから到達できない場合、これらのxml構成ファイルはSpringによってどのようにロードされるのでしょうか?答えは簡単です:ユニット/統合テストだけを実行するのではなく、webappを起動すると、ServletContext
(Servlet APIからの実際のクラス)へのアクセスを提供するServlet Containerで実行されます。したがって、ServletContext.getResourceAsStream()
を使用してこれらのファイルをロードします。理解の鍵は、このメソッドの javadoc からの次の引用です。
このメソッドは、クラスローダーを使用するJava.lang.Class.getResourceAsStreamとは異なります。このメソッドにより、サーブレットコンテナは、クラスローダーを使用せずに、任意の場所からサーブレットがリソースを利用できるようになります。
申し訳ありませんが、これは非常に長くなりますが、それは全体の話です...
これを試して
@ContextConfiguration(locations = {"classpath:**/dataSource.xml",
"classpath:**/hibernate.xml",
"classpath:**/WEB-INF/beans.xml"})