我似乎在尝试加载的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文件中定义。
答案 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)