背景
- Spring MVCをwar packagingで使っていて、そのBean定義ファイルをapplication.xmlという名前にしていた。
- Spring Bootで動かしたくなったので、まずは
@ImportResource
でapplication.xmlを読み込めるか試した。 - classpathに含まれるように、src/main/resources直下にapplication.xmlを置いた
現象
以下のようなエラーが出る。
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.xml'
... stack trace ...
Caused by: java.util.InvalidPropertiesFormatException: org.xml.sax.SAXParseException; lineNumber: 19; columnNumber: 87; Document root element "beans", must match DOCTYPE root "null".
... stack trace ...
原因
Spring BootのConfigFileApplicationListenerが、xmlをBean定義ファイルではなく設定ファイル(application.properties相当)として読み込もうとしてエラーになる。
デフォルトの設定ファイル名がapplicationで、PropertiesPropertySourceLoaderが対応している拡張子にxml
が含まれるため、application.xmlが読み込み候補のファイル名になる。また、設定ファイルのデフォルトのlocationにはclasspath直下が含まれるので、classpath:/application.xml
が読み込まれる。結果として、@ImportResource
しようがしまいが関係なく、src/main/resources
直下にapplication.xmlを置いた時点で悲しい選択だった。
回避策
- ファイル名を変える
そもそもapplication.xmlという名前をなんとなくで使ってたのが良くない。
Spring Frameworkのドキュメント通りに作ればおそらくapplicationConfig.xml
になるので、普通の人は遭遇することは無さそう。 - Java化する
これを期に@Configuration
化するのも良いタイミングなのかも。