2017-05-26 3 views
-1

Boot-Konfiguration * .yml-Datei.spring.profiles funktioniert nicht wie erwartet im Spring Boot

server.port: 2222 
spring: 
    application: 
    name: x-service 
    data: 
    mongodb: 
     host: db.x 
     database: x 
#  userName: ${db.userName} 
#  password: ${db.password} 
    rabbitmq: 
# port: ${queue.port} 
    host: queue.x 
    username: ${queue.userName} 
    password: ${queue.password} 
    listener: 
     max-concurrency: 1 
     prefetch: 1 
     acknowledge-mode: auto 
     auto-startup: true 
    dynamic: true 

###########DEV############## 
spring.profiles: dev 
#queue.virtual.host: xuser 
queue.userName: guest 
queue.password: guest 
queue.port: 5672 

#db.userName: 
#db.password: 

falconUrl: http://x.y.com 
##########DEFAULT########### 
spring.profiles: qa 
queue.virtual.host: xuser 
queue.userName: xuser 
queue.password: xpassword 
queue.port: 3456 

db.userName: xuser 
db.password: xpassword 

falconUrl: http://x.z.com 

Es gibt mir org.yaml.snakeyaml.parser.ParserException: während MappingNode Parsen

in 'reader', line 1, column 1: 
    server.port: 2222 
    ^
Duplicate key: spring.profiles 
in 'reader', line 47, column 1: 

Fehler. Wenn ich Eigenschaften eines der Profile kommentiere. Es funktioniert gut. Kann jemand bitte vorschlagen, was hier falsch ist?

+0

afaik, das nur mit 'feder: profile funktioniert: sonst wird es als eine einzelne Eigenschaft geparst. Sie müssen sie verschachteln, um zu arbeiten. –

Antwort

1

Die Fehlermeldung ist eigentlich ganz spezifisch und genau: in dem Top-Level-Mapping Ihrer YAML-Datei (die mit dem Schlüssel-Wert-Paar starten server.port und 2222 Sie haben zwei identische Schlüssel (die skalare spring.profiles) und duplizieren. Schlüssel werden nicht in YAML erlaubt, da die erforderlichen unique according to the specification sein

das zugrunde liegende Problem ist, dass, wenn Sie die Konfiguration ändern abhängig von der Umgebung, werden Sie die documented specification folgen, wo es heißt:.

Eine YAML-Datei ist aktuell y Eine Folge von Dokumenten, die durch --- Linien getrennt sind, und jedes Dokument wird separat zu einer abgeflachten Karte analysiert.

Wenn ein YAML-Dokument einen Schlüssel spring.profiles enthält, wird der Wert profiles (durch Kommas getrennte Liste) in die Spring Environment.acceptsProfiles() eingegeben, und wenn eines dieser Profile aktiv ist, wird dieses Dokument einbezogen die endgültige Zusammenführung (sonst nicht)

Ihre YAML-Datei ist eine einzelne implizite YAML Dokument, weil es die Richtlinie Indikator --- fehlt, die am Anfang eines expliziten YAML Dokument auftritt. (Die YAML-Direktive ..., die angibt, dass das Ende des Dokuments möglicherweise nicht korrekt unterstützt wird, wird von snake-yaml unterstützt, zumindest wird es in den Beispielen nicht erwähnt).

Der Code sollte wie folgt aussehen:

server.port: 2222 
spring: 
    application: 
    name: x-service 
    data: 
    mongodb: 
     host: db.x 
     database: x 
#  userName: ${db.userName} 
#  password: ${db.password} 
    rabbitmq: 
# port: ${queue.port} 
    host: queue.x 
    username: ${queue.userName} 
    password: ${queue.password} 
    listener: 
     max-concurrency: 1 
     prefetch: 1 
     acknowledge-mode: auto 
     auto-startup: true 
    dynamic: true 

###########DEV############## 
--- 
spring.profiles: dev 
#queue.virtual.host: xuser 
queue.userName: guest 
queue.password: guest 
queue.port: 5672 

#db.userName: 
#db.password: 

falconUrl: http://x.y.com 
##########DEFAULT########### 
--- 
spring.profiles: qa 
queue.virtual.host: xuser 
queue.userName: xuser 
queue.password: xpassword 
queue.port: 3456 

db.userName: xuser 
db.password: xpassword 

falconUrl: http://x.z.com 

Die Aussage in der Dokumentation, dass „jedes Dokument einzeln zu einer abgeflachten Karte analysiert wird“ natürlich ist nur wahr, wenn jedes der Dokumente hat ein Mapping auf der obersten Ebene. Das ist, was Spring-Boot erwartet, aber Sie können genauso leicht einen Skalar oder eine Sequenz auf der obersten Ebene eines Dokuments haben, und solche Dokumente sind sicherlich nicht von Snake-Yaml zu einer abgeflachten Karte geparst.

+0

Verneinung, Erklärung ist falsch. Eigenschaften können auf Umweltbasis https://stackoverflow.com/questions/34615466/maven-profiles-and-application-yml-file-in-spring ausgewählt werden. Ich vermisste "---" tag – Nishat

+0

Ich habe keine Ahnung, worüber du schreibst. '---' ist kein Tag. In YAML beginnt jedes Tag mit einem Ausrufezeichen ('!') – Anthon

+0

Die gleiche YML-Datei funktioniert nach dem Ändern wie folgt: --- ########### DEV ##### ######### spring.profiles: dev # queue.virtual.host: xuser queue.userName: Gast queue.password: Gast falconUrl: http: // xycom --- DEFAULT ########## ########### spring.profiles: qa queue.virtual.host: xuser queue.userName: xuser Warteschlange .password: xpassword falconUrl: http: // xzcom ---. Sogar doppelte Schlüssel werden unterstützt und der Wert wird entsprechend der Umgebung ausgewählt. Sie können dies auch in https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html überprüfen ebenfalls. – Nishat

Verwandte Themen