มีวิธีระบุค่าคุณสมบัติเริ่มต้นใน Spring XML หรือไม่


92

เรากำลังใช้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 ซึ่งเป็นโพสต์โปรเซสเซอร์ของโรงงาน bean อื่นจะคล้ายกับ PropertyPlaceholderConfigurer แต่ในทางตรงกันข้ามกับคำจำกัดความเดิมอาจมีค่าเริ่มต้นหรือไม่มีค่าเลยสำหรับคุณสมบัติ bean หากไฟล์คุณสมบัติการลบล้างไม่มีรายการสำหรับคุณสมบัติ bean บางอย่างระบบจะใช้นิยามบริบทเริ่มต้น


ใครช่วยอธิบายให้ฉันฟังหน่อยว่า a 18GerPD8fY4iTbNpC9hHNXNHyrDMampPLAคืออะไร? ฉันแน่ใจว่าคนอื่นรู้และฉันก็โง่ แต่ในกรณี ...
Sridhar Sarnobat

277

Spring 3 รองรับ${my.server.port:defaultValue}ไวยากรณ์


8
สำหรับการอ้างอิง: SPR-4785
cubanacan

11
สำหรับฉันมันจะแทนที่คุณสมบัติด้วยค่าเริ่มต้นเสมอไม่ว่าคุณสมบัติจะถูกกำหนดหรือไม่ก็ตาม
Ondrej Bozek

13
@OndrejBozek - (ขออภัยชนโพสต์เก่า) ผมเคยทำงานเป็นสิ่งที่อาจเป็นปัญหาเดียวกันเห็นปัญหาฤดูใบไม้ผลิกรอบ [ jira.spring.io/browse/SPR-9989] ในกรณีที่เกี่ยวข้องกับตัวกำหนดค่าตัวยึดตำแหน่งหลายตัวค่าเริ่มต้นที่ระบุด้วยสัญกรณ์ ':' จะได้รับการแก้ไขโดยผู้กำหนดค่าตัวยึดตำแหน่งแรกในห่วงโซ่เท่านั้น ดังนั้นหากผู้กำหนดค่าตัวแรกไม่มีคุณสมบัติคุณสมบัติจะถูกตั้งค่าเป็นค่าเริ่มต้นเสมอแม้ว่าผู้กำหนดค่าที่อยู่ถัดจากห่วงโซ่จะมีคุณสมบัติก็ตาม ดู [ stackoverflow.com/a/22452984/599609]
โทน

1
ดูเหมือนว่า${my.server.port:-defaultValue}จะให้ผลลัพธ์เช่นเดียวกันโปรดสังเกต " :-" ซึ่งตรงข้ามกับ " :"
Captain Man

2
คุณต้องเพิ่ม<context:property-placeholder/>เพื่อให้ใช้งานได้หรือเพิ่ม aPropertyPlaceholderConfigurer
shuckc

34

มีคุณสมบัติที่รู้จักกันเล็กน้อยซึ่งทำให้ดียิ่งขึ้น คุณสามารถใช้ค่าเริ่มต้นที่กำหนดค่าได้แทนค่าฮาร์ดโค้ดนี่คือตัวอย่าง:

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}}นี้ทำงานให้ฉัน สิ่งนี้ทำให้ค่าเริ่มต้นของฉันเป็นตัวแปร
LatestStackOverflowUser


11

ค่าดีฟอลต์สามารถตาม:หลังด้วยคีย์คุณสมบัติเช่น

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

หรือในรหัสจาวา:

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

ดู:

BTW ตัวดำเนินการ Elvisมีให้ใช้งานใน Spring Expression Language (SpEL) เท่านั้น
เช่น: https://stackoverflow.com/a/37706167/537554


9

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> 

ขอบคุณมีคำพูดเกี่ยวกับเรื่องนั้นในฤดูใบไม้ผลิ javadoc แต่ฉันนึกไม่ออกว่าจะทำอย่างไร!
Guillaume

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

มันเป็นการค้นพบที่แท้จริงสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.