Несколько файлов свойств в Spring 3.0 - PullRequest
19 голосов
/ 19 января 2012

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

В предыдущих вопросах упоминалось об этом, и здесь есть хороший пост здесь , в котором описано, какиспользовать PropertyPlaceholderConfigurer в каждом контексте, упорядочить их по приоритету и установить для ignoreUnresolveablePlaceholder значение true, чтобы эти файлы свойств могли перекрестно ссылаться друг на друга, не разрушаясь.

Однако это не решает мою проблему, так как я тожехочу иметь возможность использовать свойства, которые я загружаю, для некоторого пользовательского разрешения заполнителя (из некоторых файлов yaml, которые я анализирую).Это требует использования PropertyPlaceholderHelper, который требует в качестве аргумента объект Properties.

Насколько я могу судить, потенциальные решения:

1) Объединить все файлы свойств в один компонент свойств.Затем его можно использовать для создания PropertyPlaceholderConfigurer (для внутреннего разрешения заполнителя Spring) и использовать с PropertyPlaceholderHelper (для моего собственного разрешения заполнителя)

2) Каким-то образом настроить PropertyPlaceholderHelper для использования набора свойств и их иерархической структурыдоговоренности, проводимой PropertyPlaceholderConfigurers, если я пойду дальше и последую совету этого блога.

К сожалению, я не могу понять, как это сделать.Любая помощь будет принята с благодарностью!

PS Похоже, что Spring 3.1 будет здесь очень полезен ... к сожалению, мы еще не готовы перейти к ней, поэтому мне все еще нужно решение, которое поможет мне!

**** РЕДАКТИРОВАТЬ ****

Спасибо за ответы до сих пор.Это хорошие ответы, но, к сожалению, они мне не помогут, потому что (и извиняюсь за то, что не упомянули об этом раньше), мы сейчас находимся в процессе отделения основных модулей нашего проекта от неосновных.Это означает, что основные модули и их контекст приложения не могут жестко закодировать имена файлов свойств.К сожалению, сканирование пути к классам в Spring не работает, поэтому подстановочные знаки типа «classpath *: *. Properties» работают только при сборке отдельных модулей, а не проекта верхнего уровня (я считаю, что это известная проблема).

Тогда возникает вопрос, как объединить файлы свойств, определенные в неосновных модулях, в существующие файлы свойств, определенные в базовых модулях.Сейчас я работаю с BeanPostProcessor - мне просто интересно, есть ли более простой / более элегантный способ сделать это?

Спасибо

Ответы [ 3 ]

9 голосов
/ 19 января 2012

Вы можете легко собрать несколько файлов свойств в один компонент:

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="singleton" value="true"/>
  <property name="ignoreResourceNotFound" value="true"/>
  <property name="locations">
    <list>
      <value>classpath*:default.properties</value>
      <value>classpath*:overrides.properties</value>
      <value>file:${APP_HOME}/**/*.properties</value>
    </list>
  </property>
</bean>

Этот конкретный пример соберет все default.properties, overrides.properties в classpath и файлы свойств в вашем APP_HOME. Теперь вы можете ссылаться на этот bean-компонент из ProperyPlaceholderConfigurer или вашего собственного постпроцессора.

7 голосов
/ 19 января 2012

Следующий фрагмент кода должен помочь вам начать

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder">
    <property name="ignoreUnresolvablePlaceholders" value="true"/>
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="searchSystemEnvironment" value="true"/>
    <property name="locations">
        <list>
            <value>classpath*:config/*/config1/*.properties</value>
            <value>classpath*:config/*/config2/*.properties</value>
            <value>classpath*:config/*/config3/*.properties</value>
            <value>classpath*:custom.properties</value>
        </list>
    </property>
</bean>     

Вы можете хранить файлы свойств в следующей иерархии, убедившись, что конфигурация доступна через classpath

config
  config1
     a.properties
  config2
     b.properties
  config3
     c.properties
custom.properties
6 голосов
/ 10 марта 2014

Это все, что вам нужно сделать:

<context:property-placeholder location="first.properties" order="0" ignore-unresolvable="true"/>
<context:property-placeholder location="second.properties" order="0" ignore-unresolvable="true"/>
<context:property-placeholder location="empty.properties" order="1"/>

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

В решении используется order для определения последнего property-placeholder и значение ignore-unresolvable="true" для всех остальных, так что каждый property-placeholder может предоставить значение. В многомодульных проектах последний property-placeholder может быть пустым или содержать failsafe-defaults.

Примечание: , если вы установите для свойства-заполнителя значение ignore-unresolvable="true" Spring просто передаст то, что вы написали, без исключения. Если, конечно, вы ожидаете, что это будет что-то отличное от String, вы наверняка получите сообщение типа java.lang.NumberFormatException: For input string: "${something}" во время преобразования формата.

Примечание: будет использоваться только первое (с наименьшим order) property-placeholder со значением для конкретного свойства. Если вы хотите переопределить свойства, используйте больший диапазон order, чем 0 и 1 или property-override.

Протестировано с Spring 3.2.1, но все упомянутые свойства существуют в 3.0. См. JavaDoc PropertyPlaceholderConfigurer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...