2015-01-13 16 views
6

Tại dự án với Spring Boot, chúng tôi sử dụng application.properties nhưng cần phải định cấu hình một số thuộc tính này (như số cổng ghi nhật ký) dựa trên cấu hình bên ngoài. Chúng tôi truy cập cấu hình thông qua API để nó chỉ được biết đến khi chạy.Đặt/ghi đè thuộc tính Spring/Spring Boot tại thời điểm chạy

Có cách nào để ghi đè hoặc đặt một số thuộc tính Spring trong thời gian chạy (ví dụ sử dụng bean) và nếu có thì làm cách nào để đạt được điều này?

+0

Tôi không hiểu. Bạn có thể sử dụng tất cả các nguồn dữ liệu khác nhau cho 'Môi trường' của bạn. Bạn đã đọc tài liệu: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config phải không? Tại sao điều đó không hoạt động? –

Trả lời

1

Bạn có thể sử dụng thuộc tính hệ thống để chuyển vào biến không? Nếu bạn định cấu hình PropertyPlaceholderConfigurer, bạn có thể đặt độ ưu tiên của thuộc tính hệ thống so với thuộc tính tệp.

Ví dụ, một cái gì đó như:

@Bean public PropertyPlaceholderConfigurer placeHolderConfigurer() { 
    PropertyPlaceholderConfigurer props = new PropertyPlaceholderConfigurer() 
    props.setSystemPropertiesMode(PropertyPlaceholderConfigurer.SYSTEM_PROPERTIES_MODE_OVERRIDE) 
    props.setLocations(new 
PathMatchingResourcePatternResolver().getResources("classpath:/**.properties")); 
    props 
} 

Trên đây sẽ tải tập tin .properties của bạn, nhưng chúng tôi đặt ưu tiên là các biến hệ thống đầu tiên, vì vậy nếu bạn thiết lập một biến hệ thống đó sẽ ghi đè lên các biến tương tự trong cấu hình.

Ngoài ra, nhìn vào the docs, Spring khuyên bạn xác định một trật tự tìm kiếm trong môi trường của bạn:

[PropertyPlaceholderConfigurer vẫn còn thích hợp để sử dụng khi] cấu hình hiện tại làm cho việc sử dụng "systemPropertiesMode" và/hoặc "systemPropertiesModeName " tính chất. Người dùng được khuyến khích để di chuyển ra khỏi việc sử dụng các cài đặt này và thay vì định cấu hình thuộc tính thứ tự tìm kiếm nguồn thông qua Môi trường của vùng chứa; tuy nhiên, duy trì chính xác chức năng có thể được duy trì bằng cách tiếp tục sử dụng sử dụng PropertyPlaceholderConfigurer.

Hy vọng một trong những điều trên cần phân loại những gì bạn cần?

+1

Tôi sẽ không khuyên bạn sử dụng 'PropertyPlaceholderConfigurer' trong ứng dụng Khởi động mùa xuân (nó đã được cung cấp). –

6

Bạn có thể làm điều này với Spring Cloud Config

Chỉ với mục đích minh hoạ, đây là một cách tương đối nhanh chóng để xem ghi đè bất động sản năng động trong thời gian chạy:

Đầu tiên, cho đậu của bạn để có thể nhận thay đổi tài sản, bạn cần phải chú thích nó với

@RefreshScope 

Thêm sự phụ thuộc vào mùa xuân đám mây để ứng dụng khởi động mùa xuân của bạn, ví dụ như cho gradle

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter', version: '1.1.1.RELEASE' 

(NB Bạn cũng cần mùa xuân phụ thuộc khởi động thiết bị truyền động.)

Với ứng dụng đang chạy, bạn có thể xem cấu hình hiện tại của bạn ở ví dụ

http://localhost:8080/env 

ví dụ nếu bạn có một tài sản 'của tôi. thuộc tính 'trong application.properties, bạn sẽ thấy một cái gì đó như:

"applicationConfig: [classpath:/application.properties]": { 
    "my.property": "value1", 
    etc 

Để thay đổi giá trị, BÀI ĐĂNG.tài sản = value2 đến/env như application/x-www-form-urlencoded

ví dụ

curl -X POST http://localhost:8080 -d my.property=value2 

GET/env lần nữa và bạn sẽ thấy giá trị mới xuất hiện dưới "quản lý" phần

Để áp dụng các thuộc tính đã thay đổi, hãy làm một POST trống/làm mới. Bây giờ đậu của bạn sẽ có giá trị mới.

+0

Nó có hoạt động với các thuộc tính hệ thống không? – gstackoverflow

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