Я новичок в Spring и унаследовал проект Spring, который имел всю конфигурацию XML в ProjectName/WebContent/WEB-INF/applicationContext.xml. Я пытаюсь разбить конфигурацию на различные компоненты, чтобы было проще подставлять такие вещи, как DataSources и конфигурация Hibernate при тестировании.
Вот структура моего файла:
ProjectName
->WebContent
->WEB-INF
->applicationContext.xml
->spring-datasource.xml
->spring-hibernate-properties.xml
->spring-persistence.xml
->test
->us.mn.k12... (Java pkgs with JUnit tests)
->spring-hsqldb-datasource.xml
->spring-test-bean-locations.xml
->spring-test-hibernate-properties.xml
->src
->us.mn.k12... (Java pkgs with production code)
В WEB-INF/applicationContext.xml я импортирую следующее:
<import resource="spring-datasource.xml"/> <!-- Production datasource -->
<import resource="spring-hibernate-properties.xml"/> <!-- Production hibernate properties -->
<import resource="spring-persistence.xml"/> <!-- DAO's, hibernate .hbm.xml mapping files -->
Приложение работает с вышеуказанной конфигурацией.
Мои тесты JUnit работают с использованием DbUnit и базы данных HSQLDB in-memory. Поэтому мой тест JUnit ссылается на spring-test-bean-locations.xml, в котором есть следующее:
<import resource="spring-hsqldb-datasource.xml"/> <!-- HSQLDB datasource for test -->
<import resource="../WebContent/WEB-INF/spring-persistence.xml"/> <!-- Production DAO's, hibernate .hbm.xml mapping files -->
<import resource="spring-test-hibernate-properties.xml"/> <!-- Hibernate properties for test -->
Таким образом, я могу указать тестовый источник данных и свойства hibernate, но повторно использовать производственный файл отображения для DAO и т. д. Однако при запуске теста JUnit я получаю ошибку. Вот соответствующая часть исключения:
Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative location [../WebContent/WEB-INF/spring-persistence.xml]
Offending resource: class path resource [spring-test-bean-locations.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [../WebContent/WEB-INF/spring-persistence.xml]; nested exception is java.io.FileNotFoundException: class path resource [../WebContent/WEB-INF/spring-persistence.xml] cannot be opened because it does not exist
Теперь, если я перемещу spring-persistence.xml в /test, чтобы не использовать относительный путь, и ссылаюсь на него с помощью
, то тесты выполняются нормально. Поэтому я думаю, что содержимое моих XML файлов в порядке, но я не правильно импортирую с относительным путем.
Есть ли что-то очевидное, что я делаю неправильно при импорте с относительным путем? И, возможно, более важный вопрос: похоже ли это на разумную стратегию разбиения applicationContext.xml на компоненты, чтобы облегчить тестирование?
Спасибо!