使用@ConfigurationProperties和命令行参数的Spring Boot配置行为

时间:2016-02-08 05:07:54

标签: spring spring-boot

我似乎在尝试加载的yaml属性文件上有一些有趣的Spring启动行为。

我有一个设置bean,设置如下:

@ConfigurationProperties(location = 'config.yml', prefix='settings')
public class Settings {
    private String path;
    ...
}

我已明确告诉spring在config.yml文件中查找属性值以绑定到Settings bean。这看起来像这样:

settings:
   path: /yaml_path

这很好用但是,我似乎无法从命令行覆盖这些值,即

java -jar my.jar --settings.path=test

绑定到设置bean的值仍然是/ yaml_path,但是预计--settings.path = test会覆盖yaml中的设置。

有趣的是,我注意到如果我从yaml文件中注释掉路径设置,test的命令行参数值就会通过。

此外,我还注意到,如果我将配置文件从config.yml更改为application.yml并删除'位置'来自配置属性文件的属性这给了我想要的所需行为,但意味着我在类路径中不能有多个application.yml文件,因为它会破坏我的多模块应用程序,其中包含整个配置文件。

理想世界我希望能够让模块从包含该模块安全值的yaml文件中读取配置(即module.yml),并且如果需要,可以从命令行覆盖这些值。有没有人想出如何以这种方式将命令行参数传递给bean?

我在git hub上创建了一个项目来展示问题

https://github.com/vcetinick/spring-boot-yaml-test

运行应用程序会显示有关应用的设置的日志记录信息。即。

  

java -jar spring-boot-yaml-test-0.0.1-SNAPSHOT.jar --config.path = / test

应覆盖设置,但是会显示默认的/ var / tmp

另外,在使用application.yml配置时

  

java -jar spring-boot-yaml-test-0.0.1-SNAPSHOT.jar --app.path = / test

似乎按预期运行,其中命令行参数覆盖该值但仅起作用,因为其值在application.yml文件中定义。

1 个答案:

答案 0 :(得分:0)

看起来locations属性按设计工作,但似乎与spring boot(https://github.com/spring-projects/spring-boot/issues/5111)设置的标准配置范例不一致。它旨在覆盖设置。看起来这个功能可能会在将来的spring boot版本中被删除(https://github.com/spring-projects/spring-boot/issues/5129