28

WEB-INFディレクトリの下にいくつかのXMLファイルがあります。

  • LyricsBaseApp-servlet.xml
  • hibernate.xml
  • dataSource.xml
  • Beans.xml

サーブレットxmlは他のxmlファイルをインポートします。

<import resource="dataSource.xml"/>
<import resource="hibernate.xml"/>
<import resource="beans.xml"/>

JukeboxTestjunit4クラスにスプリング構成全体を含めたいのですが。デフォルトのファイル名を使用して、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"/>

と他のいくつかのアイデアがすべて失敗しました。誰かがそれらのファイルにアクセスする方法と、Springがそれらのファイルパスをどのように解釈するかを教えてもらえますか?

4

2 に答える 2

86

オプション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プロジェクト構造を想定すると:

  1. からのJavaクラスはコンパイル後にsrc/main/java移動します。/WEB-INF/classes
  2. src/main/resourcesからのリソース/WEB-INF/classesも同様です。
  3. プロジェクトの依存関係はに移動し/WEB-INF/libます。
  4. あなたが持っているものはすべて(パッケージのルート)にsrc/main/webapp行きます。/これは、もちろん、からのすべてのファイルがsrc/main/webapp/WEB-INFに移動することを意味します。/WEB-INF

知っておくべき最も重要なことは、クラスパスには、の/WEB-INF/classesjarごとに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とは異なります。このメソッドを使用すると、サーブレットコンテナは、クラスローダーを使用せずに、任意の場所からサーブレットでリソースを利用できるようになります。

申し訳ありませんが、これは長すぎますが、それが全体の話です...

于 2013-02-18T22:25:18.767 に答える
12

これを試して

@ContextConfiguration(locations = {"classpath:**/dataSource.xml",
                               "classpath:**/hibernate.xml", 
                               "classpath:**/WEB-INF/beans.xml"})
于 2013-02-19T07:46:40.603 に答える