Использование нескольких файлов свойств (через PropertyPlaceholderConfigurer) в нескольких проектах/модулях
В настоящее время мы пишем приложение, которое разбивается на несколько проектов/модулей. Например, допустим следующие модули:
- MYAPP-DAO
- MYAPP-трескотня
Каждый модуль имеет свой собственный XML файл Spring. Для модуля DAO у меня есть PropertyPlaceholderConfigurer, который считывает файл свойств с необходимыми параметрами соединения db. В модуле jabber у меня также есть PropertyPlaceHolderConfigurer для свойств соединения jabber.
Теперь идет основное приложение, которое включает myApp-DAO и myApp-jabber. Он считывает все файлы контекста и запускает один большой контекст Spring. К сожалению, похоже, что для каждого контекста может быть только один PropertyPlaceholderConfigurer, поэтому, в зависимости от того, какой модуль загружается, он может прочитать его параметры соединения. Другая генерирует исключение с ошибкой типа "Не удалось разрешить placeholder" jabber.host "
Я понимаю, в чем проблема, но я действительно не знаю решения - или лучшей практики для моего использования.
Как мне настроить каждый модуль, чтобы каждый мог загрузить свой собственный файл свойств? Прямо сейчас я переместил PropertyPlaceHolderConfigurer из отдельных файлов контекста и объединил их в основной контекст приложения (загружая все файлы свойств с помощью одного PropertyPlaceHolderConfigurer). Это отстойно, потому что теперь каждый, кто использует модуль dao, должен знать, что им нужен PropertyPlaceHolderConfigurer в их контексте. Также тесты интеграции в dao-модуле терпят неудачу и т.д.
Мне интересно узнать о решениях/идеях сообщества stackoverflow.
Ответы
Ответ 1
Если вы гарантируете, что каждый владелец места в каждом из контекстов участвует в игнорировании неразрешимых ключей, то оба этих подхода работают. Например:
<context:property-placeholder
location="classpath:dao.properties,
classpath:services.properties,
classpath:user.properties"
ignore-unresolvable="true"/>
или
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:dao.properties</value>
<value>classpath:services.properties</value>
<value>classpath:user.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>
Ответ 2
Я знаю, что это старый вопрос, но свойство ignore-unresolvable
не работало для меня, и я не знал почему.
Проблема заключалась в том, что мне нужен внешний ресурс (что-то вроде location="file:${CATALINA_HOME}/conf/db-override.properties"
), а ignore-unresolvable="true"
не выполняет эту работу в этом случае.
Что нужно сделать для игнорирования отсутствующего внешнего ресурса:
ignore-resource-not-found="true"
На всякий случай кто-то еще сталкивается с этим.
Ответ 3
У вас может быть несколько элементов <context:property-placeholder />
вместо явного объявления нескольких свойств PropertiesPlaceholderConfigurer beans.
Ответ 4
PropertiesPlaceholderConfigurer
bean имеет альтернативное свойство, называемое "propertiesArray". Используйте это вместо свойства свойств и настройте его с помощью <array>
ссылок на свойства.
Ответ 5
Я попробовал решение ниже, оно работает на моей машине.
<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />
<context:property-placeholder location="classpath*:general.properties" order="2"/>
В случае присутствия нескольких элементов в Spring, существует несколько лучших практик, которые должны быть а затем:
необходимо указать атрибут заказа, чтобы исправить порядок, в котором они обрабатываются Spring всеми заполнителями свойств минус последние один (самый высокий порядок) должен иметь ignore-unresolvable="true"
, чтобы разрешить механизм разрешения для передачи другим в контексте без выбрасывание исключения
источник: http://www.baeldung.com/2012/02/06/properties-with-spring/