Использование нескольких файлов свойств (через 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/