src/main/webapp/WEB-INF/applicationContext.xml
のような位置にspringのbean定義ファイルをつくる例が多いようです。実際、巷の書籍やIT系サイトの記事などでもそのようなサンプルがよく公開されています。
しかし、この配置方法には実は大きな問題があります。JUnitなどのテストケースを実行するとき、その設定ファイルをロードできません。なぜならWEB-INFの直下はクラスパスではないからです。
- @ContextConfiguration and loading contexts from /WEB-INF [Archive] - Spring Community Forums (2009年ごろのSpringの公式フォーラムでのスレッド)
eclipse上でsrc/main/resources/applicationContext.xml のようなビルドパスの通っている位置に移動させたうえで、web.xmlのほうには
org.springframework.web.context.ContextLoaderListener
contextConfigLocation
classpath:mainContextConfig.xml
のようにclasspath:記法で書いておけば、クラスパス配下の設定ファイルをロードしてくれる(実体はWEB-INF/classes/mainContextConfig.xmlのようになる)。。。
はずなのですが、そうはとんやかです。詳細は不明ですが、ContextLoaderListenerは強制的にWEB-INF/直下の設定ファイルを探しに行ってしまいます。 結果、FileNotFoundExceptionを吐いてWebアプリが起動しません。 これを防ぐため、たとえば
contextConfigLocation
WEB-INF/applicationContext.xml, classpath:mainContextConfig.xml
のように書いておき、applicationContext.xmlには<beans><!-- dummy! --></beans>のような無設定のダミーを仕込んで、本来の設定をすべてclasspath:mainContextConfig.xmlのほうに書いておくことで対応できます。
>ContextLoaderListenerは強制的にWEB-INF/直下の設定ファイルを探しに行ってしまいます。
ReplyDeleteいまためしてみたら、そうでもないっぽいです。あれれ??