启动配置* .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:
错误。如果我评论其中一个配置文件的属性。它工作正常。 任何人都可以建议这里有什么问题吗?
答案 0 :(得分:2)
错误消息实际上非常具体和准确:在YAML文件的顶级映射中(从键值对server.port
和2222
开始,您有两个相同的键(标量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所期望的,但你可以很容易地在文档的顶层有一个标量或序列,并且这些文件