spring.profiles在spring boot中没有按预期工作

时间:2017-05-26 09:31:53

标签: spring-boot yaml

启动配置* .yml文件。

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:

错误。如果我评论其中一个配置文件的属性。它工作正常。 任何人都可以建议这里有什么问题吗?

1 个答案:

答案 0 :(得分:2)

错误消息实际上非常具体和准确:在YAML文件的顶级映射中(从键值对server.port2222开始,您有两个相同的键(标量spring.profiles)。YAML中不允许使用重复键,因为它们必须是unique according to the specification

根本问题是,如果您想根据环境更改配置,则必须遵循documented specification,其中声明:

  

YAML文件实际上是由---行分隔的文档序列,每个文档被分别解析为展平地图。

     

如果YAML文档包含spring.profiles键,则配置文件值(以逗号分隔的配置文件列表)将被输入Spring Environment.acceptsProfiles(),如果这些配置文件中的任何一个处于活动状态,则该文档包含在最终合并(否则不是)

您的YAML文件是单个隐式YAML文档,因为它缺少在显式YAML文档开头出现的指令指示符---。 (表示文档结尾的YAML指令...可能不受snake-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

文档中的声明" 每个文档被单独解析为展平地图"当然只有在每个文档都有顶层映射时才是真的。这就是spring-boot所期望的,但你可以很容易地在文档的顶层有一个标量或序列,并且这些文件当然不会被解析为snake-yaml到一个展平的地图。 / p>