2010-03-25 48 views
80

Chúng tôi đang sử dụng một PropertyPlaceholderConfigurer để sử dụng tính java trong cấu hình Spring của chúng tôi (details here)Có cách nào để chỉ định giá trị thuộc tính mặc định trong Spring XML không?

ví dụ:

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

Chúng tôi muốn thêm một tài sản bổ sung, nhưng có một hệ thống phân phối đó các phiên bản hiện có tất cả có thể sử dụng giá trị mặc định. Có cách nào để tránh cập nhật tất cả các tệp thuộc tính của chúng tôi, bằng cách chỉ ra giá trị mặc định trong cấu hình Spring khi không có giá trị thuộc tính ghi đè được xác định?

Trả lời

13

Bạn đang tìm kiếm các PropertyOverrideConfigurer tài liệu ở đây

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

Các PropertyOverrideConfigurer, khác bean factory hậu xử lý, cũng tương tự như PropertyPlaceholderConfigurer, nhưng trong Ngược lại với trường hợp sau, các định nghĩa ban đầu có thể có giá trị mặc định hoặc không có giá trị nào cho thuộc tính bean. Nếu tệp thuộc tính ghi đè không không có mục nhập cho thuộc tính bean nhất định, ngữ cảnh mặc định định nghĩa được sử dụng.

+0

Ai đó có thể giải thích cho tôi biết '18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA' là gì? Tôi chắc rằng mọi người khác đều biết và tôi chỉ ngu ngốc, nhưng chỉ trong trường hợp ... –

237

Spring 3 hỗ trợ cú pháp ${my.server.port:defaultValue}.

+8

Chỉ để tham khảo: [SPR-4785] (https://jira.springsource.org/browse/SPR-4785) – cubanacan

+8

đối với tôi, nó luôn ghi đè thuộc tính với giá trị mặc định cho dù thuộc tính được xác định hay không. –

+0

Nó hoạt động tốt cho tôi! –

8

http://thiamteck.blogspot.com/2008/04/spring-propertyplaceholderconfigurer.html chỉ ra rằng "tính địa phương" được xác định trên bean đó sẽ được coi là giá trị mặc định được ghi đè bởi các giá trị đọc từ tập tin:

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

thx, có những từ về điều đó trong mùa xuân javadoc, nhưng tôi không thể tìm ra cách để làm điều đó! – Guillaume

20

có một ít tính năng được biết đến, mà làm cho thi thậm chí còn tốt hơn. Bạn có thể sử dụng một giá trị mặc định cấu hình thay vì một mã hóa cứng, đây là một ví dụ:

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> 

Để sử dụng mặc định trong khi vẫn có thể dễ dàng ghi đè sau này, hãy thực hiện việc này trong config.properties:

timeout.myBean = ${timeout.default} 
4

Sử dụng ?:, cụ thể là Elvis Operator:

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

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

Đó là một viết tắt cho các nhà điều hành ternary, available từ Spring 3.0, và có một kết nối đến the same operator in Groovy.

Các vấn đề liên quan