Чи є спосіб вказати значення властивості за замовчуванням у Spring XML?


91

Ми використовуємо PropertyPlaceholderConfigurer для використання властивостей Java у нашій конфігурації Spring ( деталі тут )

наприклад:

<foo name="port">
  <value>${my.server.port}</value>
</foo>

Ми хотіли б додати додаткову властивість, але маємо розподілену систему, де всі існуючі екземпляри можуть використовувати значення за замовчуванням. Чи є спосіб уникнути оновлення всіх наших файлів властивостей, вказавши значення за замовчуванням у конфігурації Spring, коли не визначено замінне значення властивості?

Відповіді:


14

Ви шукаєте PropertyOverrideConfigurer, задокументований тут

http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#beans-factory-overrideconfigurer

PropertyOverrideConfigurer, інший постпроцесор фабрики квасолі, схожий на PropertyPlaceholderConfigurer, але на відміну від останнього, вихідні визначення можуть мати значення за замовчуванням або взагалі не мати значень для властивостей компонента. Якщо перевизначуючий файл властивостей не має запису для певної властивості компонента, використовується визначення контексту за замовчуванням.


Хтось може пояснити мені, що 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAтаке? Я впевнений, що всі інші знають, і я просто дурний, але про всяк випадок ...
Шрідхар Сарнобат

276

Spring 3 підтримує ${my.server.port:defaultValue}синтаксис.


8
Тільки для довідки: SPR-4785
кубанакан

11
для мене це завжди замінює властивість із значенням за замовчуванням, незалежно від того, визначено властивість чи ні.
Ondrej Bozek

12
@OndrejBozek - (вибачте за старе повідомлення) Я зіткнувся з тим, що може бути тією ж проблемою, див. Проблему Spring Framework [ jira.spring.io/browse/SPR-9989] . Якщо задіяно кілька конфігураторів заповнювачів, значення за замовчуванням, зазначені із позначенням ':', вирішуються лише першим конфігуратором заповнювача в ланцюжку. Отже, якщо перший конфігуратор не має властивості, для властивості завжди буде встановлено значення за замовчуванням, навіть якщо конфігуратори далі по ланцюжку мають властивість. Див. [ Stackoverflow.com/a/22452984/599609]
тони

1
здається, це ${my.server.port:-defaultValue}також дає той самий результат, зверніть увагу на " :-" на відміну від " :".
Капітан Мен

2
Вам потрібно додати, <context:property-placeholder/>щоб це працювало, або додатиPropertyPlaceholderConfigurer
shuckc

32

Існує маловідома особливість, яка робить це ще кращим. Ви можете використовувати настроюване значення за замовчуванням замість жорстко закодованого, ось приклад:

config.properties:

timeout.default=30
timeout.myBean=60

context.xml:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>config.properties</value>
    </property>
</bean>

<bean id="myBean" class="Test">
    <property name="timeout" value="${timeout.myBean:${timeout.default}}" />
</bean>

Щоб скористатися типовим параметром, і надалі можна легко замінити, зробіть це в config.properties:

timeout.myBean = ${timeout.default}

Це спрацювало для мене ${timeout.myBean:${timeout.default}}. Це дозволило моєму за замовчуванням також бути змінною.
NewestStackOverflowUser


11

Значення за замовчуванням може слідувати за знаком :після ключа властивості, наприклад

<property name="port" value="${my.server.port:8080}" />

Або в коді Java:

@Value("${my.server.port:8080}")
private String myServerPort;

Побачити:

До речі, Оператор Елвіса доступний лише на мові Spring Expression Language (SpEL),
наприклад: https://stackoverflow.com/a/37706167/537554


8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html вказує на те , що «локальні властивості» , певні на самому компоненті буде вважатися по замовчуванням будуть перевизначені значеннями читання з файлів:

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  <property name="location"><value>my_config.properties</value></property>  
  <property name="properties">  
    <props>  
      <prop key="entry.1">123</prop>  
    </props>  
  </property>  
</bean> 

thx, про це були слова у весняному Javadoc, але я не зміг зрозуміти, як це зробити!
Гійом

0

Також я знаходжу інше рішення, яке мені підходить. У нашому старому весняному проекті ми використовуємо цей метод, щоб надати нашим користувачам можливості використовувати такі власні конфігурації:

<bean id="appUserProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="ignoreResourceNotFound" value="false"/>
    <property name="locations">
        <list>
            <value>file:./conf/user.properties</value>
        </list>
    </property>
</bean>

І в нашому коді для доступу до цих властивостей потрібно написати щось подібне:

@Value("#{appUserProperties.userProperty}")
private String userProperty

І якщо виникає ситуація, коли вам потрібно додати нову властивість, але зараз ви не хочете додавати її в робочій конфігурації користувача, це дуже швидко стає пеклом, коли вам потрібно виправити всі ваші тестові контексти, інакше ваша програма буде невдалою стартап.

Для вирішення цієї проблеми ви можете використати наступний синтаксис, щоб додати значення за замовчуванням:

@Value("#{appUserProperties.get('userProperty')?:'default value'}")
private String userProperty

Для мене це було справжнім відкриттям.

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