2015-01-13 26 views
6

Bei dem Projekt mit Spring Boot verwenden wir application.properties, müssen jedoch einige dieser Eigenschaften (wie Port-Nummer der Protokollierungsstufe) basierend auf einer externen Konfiguration konfigurieren. Wir greifen über die API auf die Konfiguration zu, so dass sie nur zur Laufzeit bekannt ist.Festlegen/Überschreiben der Spring/Spring Boot-Eigenschaften zur Laufzeit

Gibt es eine Möglichkeit, einige Spring-Eigenschaften zur Laufzeit zu überschreiben oder festzulegen (z. B. mit einer Bean), und wenn ja, wie kann dies erreicht werden?

+0

Ich verstehe nicht. Sie können alle möglichen Datenquellen für Ihre Umgebung verwenden. Haben Sie die Dokumentation gelesen: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config? Warum funktioniert das nicht? –

Antwort

1

Können Sie Systemeigenschaften verwenden, um die Variable zu übergeben? Wenn Sie PropertyPlaceholderConfigurer konfigurieren, können Sie den Vorrang von Systemeigenschaften gegenüber Dateieigenschaften festlegen.

Zum Beispiel so etwas wie:

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

Die oben würde Ihre .properties-Datei laden, aber wir setzen die Priorität Systemvariablen werden zuerst, wenn Sie also eine Systemvariable gesetzt werden, dass die gleiche Variable außer Kraft setzen in der Konfig.

Alternativ bei the docs suchen, Frühling empfiehlt, die einen Suchauftrag in Ihrer Umgebung:

[PropertyPlaceholderConfigurer für den Einsatz noch geeignet ist, wenn] bestehende Konfiguration Verwendung des „systemPropertiesMode“ macht und/oder „systemPropertiesModeName " Eigenschaften. Benutzer werden aufgefordert, davon abzuweichen, diese Einstellungen zu verwenden, und stattdessen die Eigenschaft Quellsuchreihenfolge über die Umgebung des Containers zu konfigurieren; jedoch genaue Erhaltung der Funktionalität kann beibehalten werden, indem PropertyPlaceholderConfigurer verwenden.

Hoffentlich sollte einer der oben genannten aussortieren, was Sie brauchen?

+1

Ich würde nicht empfehlen, einen 'PropertyPlaceholderConfigurer' in einer Spring Boot App zu verwenden (diese ist bereits vorhanden). –

6

Sie können dies tun, mit Spring Cloud Config

nur zum Zwecke der Illustration, hier ist eine relativ schnelle Art und Weise dynamische Eigenschaftenüberschreibungen zur Laufzeit zu sehen:

Erstens, für Ihre Bohne Lage sein geändert zu holen Eigenschaften, müssen Sie es mit

@RefreshScope 

Fügen Sie die Federwolke Abhängigkeit zu Ihrem Frühjahr Boot App mit Anmerkungen versehen, für gradle zB

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

(NB Sie müssen auch die Feder Boot Aktor Abhängigkeit.)

Mit der App ausgeführt wird, können Sie Ihre aktuelle Konfiguration an zB

http://localhost:8080/env 

zB anzeigen, wenn Sie eine Eigenschaft ‚haben meine. Eigenschaft 'in application.properties, sehen Sie etwas wie:

Um den Wert zu ändern, POST mein.property = Wert2 zu/env als application/x-www-form-urlencoded

zB

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

GET/env wieder und Sie werden der neue Wert erscheint unter dem "Manager" Abschnitt

sehen

Um die geänderten Eigenschaften anzuwenden, führen Sie einen leeren POST nach/refresh durch. Jetzt hat Ihre Bean den neuen Wert.

+0

Funktioniert es für sring Systemeigenschaften? – gstackoverflow