Apakah ada cara untuk menentukan nilai properti default di Spring XML?

92

Kami menggunakan PropertyPlaceholderConfigurer untuk menggunakan properti java di konfigurasi Spring kami ( detailnya di sini )

misalnya:

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

Kami ingin menambahkan properti tambahan, tetapi memiliki sistem terdistribusi di mana semua instance yang ada dapat menggunakan nilai default. Adakah cara untuk menghindari pembaruan semua file properti kita, dengan menunjukkan nilai default di konfigurasi Spring saat tidak ada nilai properti pengganti yang ditentukan?

Rog
sumber

Jawaban:

14

Apakah Anda mencari PropertyOverrideConfigurer yang didokumentasikan di sini

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

PropertyOverrideConfigurer, prosesor pasca pabrik kacang lainnya, mirip dengan PropertyPlaceholderConfigurer, tetapi berbeda dengan yang terakhir, definisi asli dapat memiliki nilai default atau tidak ada nilai sama sekali untuk properti kacang. Jika file Properti yang menimpa tidak memiliki entri untuk properti kacang tertentu, definisi konteks default digunakan.

JoseK
sumber
Bisakah seseorang menjelaskan kepada saya apa 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAitu? Saya yakin semua orang tahu dan saya hanya bodoh, tapi untuk berjaga-jaga ...
Sridhar Sarnobat
277

Spring 3 mendukung ${my.server.port:defaultValue}sintaks.

lexicore.dll
sumber
8
Hanya untuk referensi: SPR-
4785
11
bagi saya, itu selalu menimpa properti dengan nilai default tidak peduli apakah properti ditentukan atau tidak.
Ondrej Bozek
13
@OndrejBozek - (maaf menabrak posting lama) Saya mengalami masalah yang sama, lihat masalah Spring Framework [ jira.spring.io/browse/SPR-9989] . Jika beberapa konfigurasi placeholder dilibatkan, nilai default yang ditentukan dengan notasi ':' hanya diselesaikan oleh konfigurasi placeholder pertama dalam rantai. Jadi, jika konfigurasi pertama tidak memiliki properti, properti akan selalu disetel ke nilai default, meskipun konfigurasi di bagian bawah rantai memang memiliki properti. Lihat [ stackoverflow.com/a/22452984/599609]
nada
1
tampaknya ${my.server.port:-defaultValue}juga memberikan hasil yang sama, perhatikan " :-" sebagai lawan " :".
Kapten Man
2
Anda perlu menambahkan <context:property-placeholder/>agar ini berfungsi, atau tambahkanPropertyPlaceholderConfigurer
shuckc
34

Ada sedikit fitur yang diketahui, yang membuatnya lebih baik. Anda dapat menggunakan nilai default yang dapat dikonfigurasi daripada yang hard-code, berikut ini contohnya:

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>

Untuk menggunakan default sambil tetap dapat mengganti dengan mudah nanti, lakukan ini di config.properties:

timeout.myBean = ${timeout.default}
Michael Böckling
sumber
Ini berhasil untuk saya ${timeout.myBean:${timeout.default}}. Ini memungkinkan default saya juga menjadi variabel.
LatestStackOverflowUser
11

Nilai default dapat diikuti dengan :setelah kunci properti, misalnya

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

Atau dalam kode java:

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

Lihat:

BTW, Operator Elvis hanya tersedia dalam Spring Expression Language (SpEL),
misalnya: https://stackoverflow.com/a/37706167/537554

ryenus.dll
sumber
9

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html menunjukkan bahwa "properti lokal" yang didefinisikan pada bean itu sendiri akan dianggap default untuk diganti dengan nilai yang dibaca dari file:

<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> 
Robert Tupelo-Schneck
sumber
thx, ada kata-kata tentang itu di musim semi javadoc, tapi saya tidak tahu bagaimana melakukannya!
Guillaume
0

Juga saya menemukan solusi lain yang berhasil untuk saya. Dalam proyek pegas lama kami, kami menggunakan metode ini untuk memberikan kemungkinan kepada pengguna kami untuk menggunakan konfigurasi ini sendiri:

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

Dan dalam kode kami untuk mengakses properti ini perlu menulis sesuatu seperti itu:

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

Dan jika situasi muncul ketika Anda perlu menambahkan properti baru tetapi saat ini Anda tidak ingin menambahkannya dalam konfigurasi pengguna produksi, itu sangat cepat menjadi neraka ketika Anda perlu menambal semua konteks pengujian Anda atau aplikasi Anda akan gagal memulai.

Untuk menangani masalah ini, Anda dapat menggunakan sintaks berikutnya untuk menambahkan nilai default:

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

Itu adalah penemuan nyata bagi saya.

Ilya
sumber