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


104

Наразі ми пишемо заявку, яка розділена на кілька проектів / модулів. Наприклад, візьмемо наступні модулі:

  • myApp-DAO
  • myApp-jabber

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

Зараз виходить головне додаток, яке включає myApp-DAO та myApp-jabber. Він читає всі файли контексту і запускає один великий контекст Весни. На жаль, здається, що може існувати лише один PropertyPlaceholderConfigurer в контексті, тому той, який завантажений модуль перший, може прочитати його параметри з'єднання. Інший додає виняток із помилкою типу "Не вдалося вирішити заповнювач" jabber.host ""

Я начебто розумію, в чому проблема, але я не знаю рішення - чи найкращої практики для моєї справи.

Як я можу налаштувати кожен модуль, щоб кожен міг завантажити власний файл властивостей? Зараз я перемістив PropertyPlaceHolderConfigurer з окремих файлів контексту та об'єднав їх у основний контекст програми (завантажуючи всі файли властивостей за допомогою одного PropertyPlaceHolderConfigurer). Це все одно, тому що тепер кожен, хто використовує модуль дао, повинен знати, що їм потрібен PropertyPlaceHolderConfigurer в їхньому контексті.

Мені цікаво почути про рішення / ідеї спільноти stackoverflow ..

Відповіді:


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" було саме те, що мені потрібно, і це зробило трюк!
чорний666

1
Якщо ви додаєте весь файл в 1 тег, тоді не потрібно ignore-unresolvable="true", інакше потрібно.
Ерік Ван

Чи можете ви пояснити значення ignoreUnresolvablePlaceholders? Що таке нерозв’язні власники місць?
смарагдовий

PropertySourcesPlaceholderConfigurer- це резервна реалізація за замовчуванням з весни 3.1, тому її розумно використовувати замість PropertyPlaceholderConfigurerкласу реалізації bean.
джиор

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". Якщо у вас є кілька файлів, кожен з яких містить часткові набори властивостей, і кожен файл може існувати або не існувати, вам потрібно буде використовувати обидва.
датгуй

8

Ви можете мати кілька <context:property-placeholder />елементів замість явного декларування кількох бобів PropertiesPlaceholderConfigurer.


Я спробував використати два елементи <контексту: властивість-placeholder />, і Spring скаржився, що не може визначити вказане властивість. Я маю реалізувати прийняту відповідь, щоб вона працювала.
Мюші

4

PropertiesPlaceholderConfigurerКвасоля має альтернативне властивість «propertiesArray». Використовуйте це замість властивості "Properties" та налаштуйте його з <array>посиланнями на властивості.


2

Я спробував рішення нижче, він працює на моїй машині.

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />

<context:property-placeholder location="classpath*:general.properties" order="2"/>

Якщо у весняному контексті є кілька елементів, є кілька найкращих практик, яких слід дотримуватися:

атрибут порядку повинен бути визначений, щоб виправити порядок, в якому вони обробляються Spring, всі заповнювачі властивості мінус останній (найвищий порядок) повинні мати ignore-unresolvable=”true”можливість механізму вирішення передаватись іншим у контексті, не кидаючи виняток

джерело: http://www.baeldung.com/2012/02/06/properties-with-spring/


Чи потрібно вказати замовлення? Я спробував це, і jvm поскаржився.
Мюші
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.