В настоящее время мы пишем приложение, которое разбито на несколько проектов / модулей. Например, давайте возьмем следующие модули:
Каждый модуль имеет свой собственный XML-файл контекста Spring. Для модуля DAO у меня есть PropertyPlaceholderConfigurer, который читает файл свойств с необходимыми параметрами соединения БД. В модуле jabber у меня также есть PropertyPlaceHolderConfigurer для свойств соединения jabber.
Теперь идет основное приложение, которое включает myApp-DAO и myApp-jabber. Он читает все файлы контекста и запускает один большой контекст Spring. К сожалению, кажется, что в каждом контексте может быть только один PropertyPlaceholderConfigurer, поэтому любой загружаемый модуль может прочитать его параметры соединения. Другой выдает исключение с ошибкой типа «Не удалось разрешить заполнитель« jabber.host »»
Я вроде понимаю, в чем проблема, но на самом деле я не знаю решения - или наилучшей практики для моего варианта использования
Как мне настроить каждый модуль, чтобы каждый мог загрузить свой собственный файл свойств? Прямо сейчас я переместил PropertyPlaceHolderConfigurer из отдельных контекстных файлов и объединил их в контекст основного приложения (загрузив все файлы свойств с помощью одного PropertyPlaceHolderConfigurer). Это отстой, хотя, потому что теперь каждый, кто использует модуль dao, должен знать, что им нужен PropertyPlaceHolderConfigurer в их контексте ... также не пройдены интеграционные тесты в модуле dao и т. Д.
Мне любопытно услышать о решениях / идеях из сообщества stackoverflow ..
Если вы убедитесь, что каждый заполнитель в каждом из задействованных контекстов игнорирует неразрешимые ключи, тогда оба из этих подходов работают. Например:
<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>
Вы можете иметь несколько элементов
вместо явного объявления нескольких bean-компонентов PropertiesPlaceholderConfigurer.
Bean PropertiesPlaceholderConfigurer
имеет альтернативное свойство, называемое propertiesArray. Используйте это вместо свойства «свойства» и настройте его с помощью <массив>
ссылок на свойства.