Создание приложения или теста интеграции Spring не удается из-за типа расположения файла свойств - PullRequest
0 голосов
/ 22 декабря 2018

Наше приложение должно использовать файл .properties, который создается во время развертывания в файловой системе хоста, поэтому он не связывается с приложением .war во время сборки.Он открывается и читается классом загрузчика во время создания контекста приложения Spring

<bean id="propertiesLoader" class="com....PropertiesLoader">
  <property name="propertiesFileLocation" value="${PROPERTIES_FILE_LOCATION}"/>
  ...

, где значение пути файла PROPERTIES_FILE_LOCATION определено в файле application.properties в src\main\resources * 1009 приложения* модуль maven

PROPERTIES_FILE_LOCATION=/home/.../propertyfilename.properties

и тип поля propertiesFileLocation String, доступ к которому осуществляется через new FileInputStream(propertiesFileLocation) в PropertiesLoader.java class

При этой настройке приложениесоздание контекста прошло успешно.Тем не менее, у нас также есть некоторые интеграционные тесты в нашем проекте, которые также настраивают Spring-контекст для их выполнения.Тем не менее, мы сохраняем копию файла propertyfilename.properties в src\test\resources модуля -it maven и ссылаемся на него из it.properties как

PROPERTIES_FILE_LOCATION=classpath:somedirectory/propertyfilename.properties    

, однако во время создания контекста интеграционного теста мыполучите следующее исключение

[ERROR] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'propertiesLoader' defined in URL 
[ERROR] Caused by: java.io.FileNotFoundException: classpath:somedirectory\propertyfilename.properties  
(The filename, directory name, or volume label syntax is incorrect)

Теперь, если мы изменим тип поля propertiesFileLocation на org.springframework.core.io.Resource и получим к нему доступ через propertiesFileLocation.getInputStream() в PropertiesLoader.java, что сделает успешным создание контекста интеграционных тестов, но в то же самое время создание реального контекста приложения завершается неудачно с

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'propertiesLoader' defined in URL 
[file:/.../tomcat/work/Catalina/localhost/_/loader/conf/spring/springmvc/springmvc-util.xml]: Invocation of init method failed; 
nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/home/.../propertyfilename.properties]

Это кажется «тупиковой» ситуацией, поскольку создание приложения или контекста интеграционного теста завершается неудачно.Есть ли способ, которым оба контекста могут быть успешно созданы?

1 Ответ

0 голосов
/ 23 декабря 2018

Загрузка ресурсов довольно хорошо описана в Справочном руководстве по Spring .Если у ресурсов нет префикса с местоположением, из которого он загружается, по умолчанию используется местоположение по умолчанию ApplicationContext.Для веб-приложения, которое будет корнем архива, в основном то, что находится в каталоге WEB-INF.\

Вы хотите загрузить ресурс файла для этого префикса ресурса с помощью file:, а в своем тесте используйте classpath:, чтобы загрузить его из `classpath.Таким образом, он будет работать независимо от того, какое расположение по умолчанию использует контекст приложения.

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