Spring XML'de varsayılan bir özellik değeri belirtmenin bir yolu var mı?


92

Spring konfigürasyonumuzda java özelliklerini kullanmak için bir PropertyPlaceholderConfigurer kullanıyoruz ( ayrıntılar burada )

Örneğin:

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

Ek bir özellik eklemek istiyoruz, ancak mevcut örneklerin hepsinin varsayılan bir değer kullanabileceği dağıtılmış bir sistemimiz var. Spring yapılandırmasında, tanımlanmış bir geçersiz kılma özellik değeri olmadığında varsayılan bir değer belirterek, tüm özellik dosyalarımızı güncellemekten kaçınmanın bir yolu var mı?

Yanıtlar:


14

Burada belgelenen PropertyOverrideConfigurer'ı mı arıyorsunuz?

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

Başka bir fasulye fabrikası son işlemcisi olan PropertyOverrideConfigurer, PropertyPlaceholderConfigurer'a benzer, ancak ikincisinin aksine, orijinal tanımlarda bean özellikleri için varsayılan değerler olabilir veya hiç değer olmayabilir. Geçersiz kılan bir Properties dosyası belirli bir bean özelliği için bir girişe sahip değilse, varsayılan bağlam tanımı kullanılır.


Biri bana a'nın ne olduğunu açıklayabilir 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAmi? Ben herkes bilir eminim ve ben sadece aptal değilim, ama her ihtimale karşı ...
Sridhar Sarnobat

277

Bahar 3 ${my.server.port:defaultValue}sözdizimini destekler .


8
Sadece referans için: SPR-4785
cubanacan

11
benim için, özellik tanımlı olsun ya da olmasın her zaman varsayılan değerle özelliği geçersiz kılar.
Ondrej Bozek

13
@OndrejBozek - (eski bir gönderiye çarptığım için üzgünüm) Aynı sorunun ne olabileceğiyle karşılaştım, bkz. Spring Framework sorunu [ jira.spring.io/browse/SPR-9989] . Birden çok yer tutucu yapılandırıcının dahil olduğu durumlarda, ':' gösterimiyle belirtilen varsayılan değerler yalnızca zincirdeki ilk yer tutucu yapılandırıcı tarafından çözümlenir. Dolayısıyla, ilk yapılandırıcı özelliğe sahip değilse, zincirin altındaki yapılandırıcılar bu özelliğe sahip olsa bile özellik her zaman varsayılan değere ayarlanacaktır. Bkz. [ Stackoverflow.com/a/22452984/599609]
tonlar

1
${my.server.port:-defaultValue}aynı sonucu veriyor gibi görünüyor , " :-" yerine " " yi not edin :.
Captain Man

2
Bunun <context:property-placeholder/>çalışması için eklemeniz veya PropertyPlaceholderConfigurer
2017

34

Bunu daha da iyi hale getiren az bilinen bir özellik var. Sabit kodlanmış bir değer yerine yapılandırılabilir bir varsayılan değer kullanabilirsiniz, işte bir örnek:

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>

Varsayılanı daha sonra kolayca geçersiz kılabilirken kullanmak için, bunu config.properties dosyasında yapın:

timeout.myBean = ${timeout.default}

Bu benim için çalıştı ${timeout.myBean:${timeout.default}}. Bu benim varsayılanımın da değişken olmasına izin verdi.
NewStackOverflowUser



9

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html , çekirdeğin kendisinde tanımlanan "yerel özelliklerin" dosyalardan okunan değerler tarafından geçersiz kılınan varsayılanlar olarak kabul edileceğini belirtir:

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

teşekkürler, bahar javadoc'ta bununla ilgili sözler vardı, ama bunu nasıl yapacağımı çözemedim!
Guillaume

0

Ayrıca benim için çalışan başka bir çözüm buluyorum. Eski yay projemizde, kullanıcılarımıza bu kendi yapılandırmalarını kullanma olanakları sunmak için bu yöntemi kullanıyoruz:

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

Ve bu özelliklere erişmek için kodumuza şöyle bir şey yazmanız gerekir:

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

Ve yeni bir mülk eklemeniz gerektiğinde, ancak şu anda bunu üretim kullanıcı yapılandırmasına eklemek istemediğinizde bir durum ortaya çıkarsa, tüm test bağlamlarınızı yamalamanız gerektiğinde çok hızlı bir şekilde cehenneme dönüşür veya uygulamanız başarısız olur. başlamak.

Bu sorunu çözmek için, varsayılan bir değer eklemek üzere sonraki sözdizimini kullanabilirsiniz:

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

Benim için gerçek bir keşifti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.