Невозможно импортировать файл определения bean-компонента Spring с использованием относительного пути - PullRequest
9 голосов
/ 22 декабря 2011

Я новичок в 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 в памяти.Так что мой тест JUnit ссылается на spring-test-bean-location.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 -->

Таким образом, я могу указать свойства источника данных теста и свойства гибернации, но повторно использовать файл производственного отображения для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, чтобы мне не приходилось использовать относительный путь, и на него указывалось <import resource="spring-persistence.xml"/>, тогда тесты запускаются нормально.Поэтому я думаю, что содержимое моих файлов XML в порядке, но я не импортирую должным образом с относительным путем.

Есть ли что-то очевидное, что я делаю неправильно с моим импортом относительного пути?И, возможно, главный вопрос в том, выглядит ли это разумной стратегией для разбиения applicationContext.xml на компоненты, чтобы облегчить его тестирование?

Спасибо!

Ответы [ 2 ]

18 голосов
/ 22 декабря 2011

Проблема в том, что все, что находится в WEB-INF, недоступно для ClassLoader при обычной настройке проекта (и Spring использует ClassLoader по умолчанию для доступа к ресурсам).Есть некоторые способы, чтобы обойти это (например, сослаться на контексты с помощью префикса file: prefix), но в большинстве случаев они ужасны.

Лучшая практика, которую я бы посоветовал, - это перенести файлы контекста из WEB-INF.и в выделенный каталог ресурсов (src / main / resources, если у вас есть настройка maven).Таким образом, они будут доступны как для веб-приложения ClassLoader, так и для локального модульного теста ClassLoaders.

Прочтите главу ресурсов , чтобы лучше понять используемые механизмы.

12 голосов
/ 19 июня 2013

Используйте

 <import resource="file:**/WebContent/WEB-INF/spring-persistence.xml" />

Работает весной 3.2.1. ВЫПУСК. Старые версии я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...