Использование нескольких файлов свойств (через PropertyPlaceholderConfigurer) в нескольких проектах / модулях

104

В настоящее время мы пишем приложение, которое разбито на несколько проектов / модулей. Например, возьмем следующие модули:

  • myApp-DAO
  • myApp-jabber

Каждый модуль имеет свой собственный XML-файл контекста Spring. Для модуля DAO у меня есть PropertyPlaceholderConfigurer, который считывает файл свойств с необходимыми параметрами подключения к базе данных. В модуле jabber у меня также есть PropertyPlaceHolderConfigurer для свойств соединения jabber.

Теперь идет основное приложение, которое включает myApp-DAO и myApp-jabber. Он читает все файлы контекста и запускает один большой контекст Spring. К сожалению, кажется, что может быть только один PropertyPlaceholderConfigurer для каждого контекста, поэтому какой бы модуль ни загружался первым, может прочитать его параметры соединения. Другой вызывает исключение с ошибкой типа «Не удалось разрешить заполнитель 'jabber.host'»

Я как бы понимаю, в чем проблема, но на самом деле я не знаю решения - или лучшей практики для моего варианта использования.

Как мне настроить каждый модуль так, чтобы каждый мог загружать свой собственный файл свойств? Прямо сейчас я переместил PropertyPlaceHolderConfigurer из отдельных файлов контекста и объединил их в контекст основного приложения (загрузив все файлы свойств с помощью одного PropertyPlaceHolderConfigurer). Это отстой, потому что теперь каждый, кто использует модуль dao, должен знать, что им нужен PropertyPlaceHolderConfigurer в их контексте ... также завершаются сбои интеграционные тесты в модуле dao и т. Д.

Мне любопытно услышать о решениях / идеях от сообщества stackoverflow ..

черный666
источник

Ответы:

182

Если вы убедитесь, что каждый заполнитель в каждом из задействованных контекстов игнорирует неразрешимые ключи, то оба этих подхода работают. Например:

<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>
Тим Хеннекей
источник
11
Вот полезная запись по теме, которая должна помочь вам в дальнейшем решении этих проблем: tarlogonjava.blogspot.com/2009/02/tips-regarding-springs.html
Тим Хеннекей
2
СПАСИБО!! ignore-unresolvable = "true" было именно тем, что мне было нужно, и оно помогло!
black666 05
1
Если вы добавляете весь файл в 1 тег, то событие не нужно ignore-unresolvable="true", иначе нужно.
Эрик Ван
Вы можете объяснить значение ignoreUnresolvablePlaceholders? Что такое неразрешимые заполнители?
emeraldhieu
PropertySourcesPlaceholderConfigurerявляется реализацией поддержки по умолчанию, начиная с Spring 3.1, поэтому его разумно использовать вместо PropertyPlaceholderConfigurerкласса реализации bean-компонента.
jihor
18

Я знаю, что это старый вопрос, но этот ignore-unresolvableобъект у меня не работал, и я не знал, почему.

Проблема заключалась в том, что мне нужен внешний ресурс (что-то вроде location="file:${CATALINA_HOME}/conf/db-override.properties"), и ignore-unresolvable="true"в этом случае он не работает.

Что нужно сделать, чтобы игнорировать отсутствующий внешний ресурс:

ignore-resource-not-found="true"

На всякий случай кто-нибудь еще столкнется с этим.

Рауль Рене
источник
3
ignore-unresolvableи ignore-resource-not-foundслужат разным целям. Чтобы предотвратить ошибки, когда файл свойств не существует, используйте ignore-resource-not-found="true". Чтобы предотвратить ошибки при использовании свойства, которого нет в файле , используйте ignore-unresolvable="true". Если у вас есть несколько файлов, каждый из которых содержит частичные наборы свойств, и каждый файл может существовать или не существовать, вам нужно будет использовать оба.
datguy 05
8

Вы можете иметь несколько <context:property-placeholder />элементов вместо явного объявления нескольких bean-компонентов PropertiesPlaceholderConfigurer.

Earldouglas
источник
Я попытался использовать два элемента <context: property-placeholder />, и Spring пожаловался, что не может идентифицировать указанное свойство. Я должен реализовать принятый ответ, чтобы он работал.
Mushy
4

PropertiesPlaceholderConfigurerФасоль имеет альтернативное свойство «propertiesArray». Используйте это вместо свойства «свойства» и настройте его с помощью <array>ссылок на свойства.

Стивен С
источник
2

Я попробовал решение ниже, оно работает на моей машине.

<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/

онурбайсан
источник
Требуется ли указанный заказ? Я попробовал это, и jvm пожаловался.
Mushy