2012-01-19 2 views
19

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

Предыдущие вопросы уже говорили об этом, и есть хороший блог here, который описывает, как использовать PropertyPlaceholderConfigurer в каждом контексте, заказать их по приоритету и установить ignoreUnresolveablePlaceholders истину так, чтобы эти файлы свойства могут включать перекрестные ссылки друг на друг, не разрушив вверх.

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

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

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

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

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

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

**** EDIT ****

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

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

Благодаря

+0

Я думаю, вам нужно предоставить хотя бы один постоянный сегмент dir, поэтому 'classpath *: *. Properties' не будет работать, но' classpath *: config/*. Properties' будет. – mrembisz

ответ

7

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

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

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

config 
    config1 
    a.properties 
    config2 
    b.properties 
    config3 
    c.properties 
custom.properties 
9

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

<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, переопределения.свойства на пути к классам и файлы свойств в вашем APP_HOME. Теперь вы можете обратиться к этому компоненту из ProperyPlaceholderConfigurer или своего пользовательского постпроцессора.

6

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

<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 могут быть пустыми или предоставлять отказоустойчивые значения по умолчанию.

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

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

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

Смежные вопросы