使用Spring从环境变量获取地图属性

问题描述 投票:0回答:1

我正在使用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
1个回答
0
投票

问题在于属性的加载顺序。看看解释加载顺序的doc。我不知道会不会对您的方案很有用,但您可以尝试创建配置文件(例如application-other.yml)并加载它。将在application.yml

之后加载
© www.soinside.com 2019 - 2024. All rights reserved.