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?
sumber
18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA
itu? Saya yakin semua orang tahu dan saya hanya bodoh, tapi untuk berjaga-jaga ...Spring 3 mendukung
${my.server.port:defaultValue}
sintaks.sumber
${my.server.port:-defaultValue}
juga memberikan hasil yang sama, perhatikan ":-
" sebagai lawan ":
".<context:property-placeholder/>
agar ini berfungsi, atau tambahkanPropertyPlaceholderConfigurer
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}
sumber
${timeout.myBean:${timeout.default}}
. Ini memungkinkan default saya juga menjadi variabel.<foo name="port"> <value>${my.server.port:8088}</value> </foo>
harus bekerja agar Anda memiliki 8088 sebagai port default
Lihat juga: http://blog.callistaenterprise.se/2011/11/17/configure-your-spring-web-application/
sumber
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:
valueSeparator
(dariAbstractPropertyResolver
)dan
VALUE_SEPARATOR
(dariSystemPropertyUtils
)BTW, Operator Elvis hanya tersedia dalam Spring Expression Language (SpEL),
misalnya: https://stackoverflow.com/a/37706167/537554
sumber
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>
sumber
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.
sumber