我正在使用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>
,值也会强制转换为字符串。
[谁能告诉我如何使用环境变量正确初始化地图,或向我指出正确的方向吗?非常感谢!
问题在于属性的加载顺序。看看解释加载顺序的doc。我不知道会不会对您的方案很有用,但您可以尝试创建配置文件(例如application-other.yml
)并加载它。将在application.yml