【发布时间】:2020-01-31 15:44:44
【问题描述】:
我正在使用 Spring Boot 创建一个微服务,该微服务使用一些通过 @Value 和 @ConfigurationProperties 加载的属性。这些属性将在application.yaml 中定义默认值,但我想用环境变量覆盖它们。我已经设法使用几乎所有基本属性类型来做到这一点,但我无法使用地图。
这是检索属性的代码,所以地图在configuration.map:
@Data
@ConfigurationProperties(prefix = "configuration")
public class MapConfig{
private Map<String, Object> map;
}
application.yaml 中的默认值是:
configuration:
map:
a: "A"
b: 2
c: true
这很好用,我得到一个包含这些键值条目的地图。当我尝试使用环境变量初始化地图时,问题就来了。我尝试了CONFIGURATION_MAP='{aa:"aa", bb:12, cc:true}' 的多个变体,每次启动应用程序时,我都会得到application.yaml 中定义的默认值,但没有环境映射的痕迹。
我还尝试添加像CONFIGURATION_MAP_AA='HELLO' 这样的变量,并且能够在我的地图中添加新值。但是我所能做的就是添加信息,但我在 yaml 中编写的默认值仍然存在。在这种情况下,我得到:
{
"aa": "HELLO",
"a": "A",
"b": 2,
"c": true
}
这不是我正在寻找的行为。我想完全覆盖默认地图而不是添加新信息。它还有一个问题,就是以这种方式添加的键总是转换为小写,所以我不能用 camelCase 覆盖键。即使我的地图是<String,Object>,值也会转换为字符串。
谁能告诉我如何使用环境变量正确初始化地图或为我指明正确的方向?非常感谢!
【问题讨论】:
标签: java spring environment-variables