2017-05-26 12 views
-1

ブート設定*の.ymlファイルで期待どおりに動作しません。spring.profilesは春ブーツ

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 

それは私をorg.yaml.snakeyaml.parser.ParserException与える:MappingNode

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

エラーを解析中。私はprofile.Itのいずれかのプロパティをコメントする場合、正常に動作します。 誰でもここに何が間違っているとお考えですか?

+0

は春 'で動作します:プロフィール:'そうでなければ、単一のプロパティとして解析されます。あなたは働くためにそれらを入れなければなりません。 –

答えて

1

エラーメッセージは、実際には非常に具体的かつ正確である:(あなたのYAMLファイルのトップレベルのマッピングでキーと値のペアserver.portから始まる1と2222次の2つの同一の鍵(スカラーspring.profiles)を持っているし、重複。インクルードがunique according to the specificationであることが要求されるキーは、YAMLで許可されていない

根本的な問題は、あなたが環境に応じて設定を変更したい場合は、あなたがいることを述べてdocumented specificationを、従わなければならないだろうということです。

YAMLファイルはactuallですy - 行で区切られたドキュメントのシーケンス。各ドキュメントはフラットマップに個別に解析されます。

YAMLドキュメントにspring.profilesキーが含まれている場合、プロファイル値(コンマ区切りのプロファイルリスト)がSpring Environment.acceptsProfiles()に渡され、それらのプロファイルのいずれかがアクティブな場合、それが明示的なYAMLドキュメントの先頭に出現ディレクティブインジケータ---がないため、最終的なマージ(そうではない)

あなたのYAMLファイルは、単一の暗黙のYAMLドキュメントです。 (エンド・オブ・ドキュメントを示すYAMLディレクティブ...がヘビYAMLによってサポート適切にサポートされていない場合があり、少なくともそれは、実施例において言及されていません)。

あなたのコードは次のようになります。

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 

「各文書が平坦化マップに別々に解析され」というドキュメントの声明を文書の各あれば、もちろん唯一の真実でありますトップレベルにマッピングがあります。これは、ばねブートが期待するものですが、同じように簡単ドキュメントの最上位レベルでのスカラまたはシーケンスを持つことができ、そのような文書は確かに平坦化されたマップに蛇のYAMLによって解析されないをしています。その私の知る限り

+0

Anthod、説明が間違っています。環境ベースのhttps://stackoverflow.com/questions/34615466/maven-profiles-and-application-yml-file-in-springでプロパティを選択できます。私は "---"タグが見つからなかった – Nishat

+0

あなたが何について書いているのか分かりません。 '---'はタグではありません。 YAMLで一人ひとりタグが – Anthon

+0

同じYMLファイルは--- ########### DEV ##### 以下のように変更した後、正常に動作している( '!')感嘆符で始まります######### spring.profiles: #1 queue.virtual.hostをdevの:XUSER queue.userName:ゲスト queue.password:ゲスト falconUrlます。http:// XYcomの --- ##########のDEFAULT ########### spring.profiles:QA queue.virtual.host:XUSER queue.userName:XUSER キュー.password:xpassword falconUrl:http:// xzcom --- ---重複したキーでもサポートされ、環境ごとに値が選択されます。https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.htmlで同じことを確認できます。また、 – Nishat