Có cách nào để chỉ định giá trị thuộc tính mặc định trong Spring XML không?


91

Chúng tôi đang sử dụng PropertyPlaceholderConfigurer để sử dụng thuộc tính java trong cấu hình Spring của chúng tôi ( chi tiết tại đây )

ví dụ:

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

Chúng tôi muốn thêm một thuộc tính bổ sung, nhưng có một hệ thống phân tán trong đó các phiên bản hiện có đều có thể sử dụng một 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 không?

Câu trả lời:


14

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

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

PropertyOverrideConfigurer, một bộ xử lý hậu kỳ của bean factory khác, tương tự như PropertyPlaceholderConfigurer, nhưng ngược lại với cái 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 các thuộc tính bean. Nếu một tệp Thuộc tính ghi đè không có mục nhập cho một thuộc tính bean nhất định, thì định nghĩa ngữ cảnh mặc định sẽ được sử dụng.


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

276

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


8
Chỉ cần cho các tài liệu tham khảo: SPR-4785
cubanacan

11
đố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ó được xác định hay không.
Ondrej Bozek

12
@OndrejBozek - (xin lỗi vì đã đăng một bài cũ) Tôi đã gặp phải vấn đề có thể là cùng một vấn đề, hãy xem vấn đề Spring Framework [ jira.spring.io/browse/SPR-9989] . Khi có nhiều trình cấu hình trình giữ chỗ tham gia, các giá trị mặc định được chỉ định bằng ký hiệu ':' chỉ được giải quyết bởi trình cấu hình trình giữ chỗ đầu tiên trong chuỗi. Vì vậy, nếu trình cấu hình đầu tiên không có thuộc tính, thuộc tính sẽ luôn được đặt thành giá trị mặc định, ngay cả khi các trình cấu hình ở dưới chuỗi có thuộc tính đó. Xem [ stackoverflow.com/a/22452984/599609]
âm

1
nó có vẻ ${my.server.port:-defaultValue}cũng cho kết quả tương tự, lưu ý " :-" trái ngược với " :".
Captain Man,

2
Bạn cần thêm <context:property-placeholder/>để điều này hoạt động hoặc thêm mộtPropertyPlaceholderConfigurer
shuckc

32

Có một tính năng ít được biết đến, điều này làm cho điều này thậm chí còn tốt hơn. Bạn có thể sử dụng giá trị mặc định có thể định cấu hình thay vì giá trị được 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}

Điều này đã làm việc cho tôi ${timeout.myBean:${timeout.default}}. Điều này cho phép mặc định của tôi cũng là một biến.
NewestStackOverflowUser 17/12/18


11

Giá trị mặc định có thể được theo sau bằng một :sau khóa thuộc tính, ví dụ:

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

Hoặc trong mã java:

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

Xem:

BTW, Toán tử Elvis chỉ khả dụng trong Ngôn ngữ biểu thức mùa xuân (SpEL),
ví dụ: https://stackoverflow.com/a/37706167/537554


8

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

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

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

0

Tôi cũng tìm thấy một giải pháp khác phù hợp với tôi. Trong dự án mùa xuân kế thừa của chúng tôi, chúng tôi sử dụng phương pháp này để cung cấp cho người dùng khả năng sử dụng các cấu hình riêng này:

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

Và trong mã của chúng tôi để truy cập thuộc tính này cần viết một cái gì đó như thế:

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

Và nếu một tình huống phát sinh khi bạn cần thêm thuộc tính mới nhưng ngay bây giờ bạn không muốn thêm thuộc tính đó trong cấu hình người dùng sản xuất thì rất nhanh chóng trở thành địa ngục khi bạn cần vá tất cả các ngữ cảnh thử nghiệm của mình hoặc ứng dụng của bạn sẽ bị lỗi. khởi động.

Để xử lý sự cố này, bạn có thể sử dụng cú pháp tiếp theo để thêm giá trị mặc định:

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

Đó là một khám phá thực sự đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.