【问题标题】:Spring Boot doesn't load a Map from environment variables when in camel-case在骆驼情况下,Spring Boot 不会从环境变量中加载 Map
【发布时间】:2019-09-04 09:28:44
【问题描述】:

我设置了环境变量

MY_APP_MY_MAP_A1=a
MY_APP_MY_MAP_A2=b
MY_APP_JUSTMAP_A1=a
MY_APP_JUSTMAP_A2=b

通过@ConfigurationProperties 配置我的 Spring Boot (2.1.7.RELEASE) 应用程序:

@SpringBootApplication
@EnableConfigurationProperties(MyApp.MyProperties.class)
public class MyApp {

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }

    @Bean
    public CommandLineRunner cmd(MyProperties props) {
        return args -> {
            System.out.println("myMap: " + props.getMyMap());
            System.out.println("justmap: " + props.getJustmap());
        };
    }

    @ConfigurationProperties(prefix = "my.app")
    @Getter
    @Setter
    static class MyProperties {
        private Map<String, String> myMap;
        private Map<String, String> justmap;
    }
}

当变量名包含大写字母(驼峰式)时,设置Map&lt;String,String&gt; 不起作用,否则一切正常:

myMap: null
justmap: {a1=a, a2=b}

有什么办法吗?

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    如果您有以下环境。传递的变量

    MY_APP_MYMAP_A1=a
    MY_APP_MYMAP_A2=b
    MY_APP_JUSTMAP_A1=a
    MY_APP_JUSTMAP_A2=b
    

    下面的代码打印出你所期望的

    @SpringBootApplication
    @EnableConfigurationProperties(TestSpringBootApplication.MyProperties.class)
    public class TestSpringBootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(TestSpringBootApplication.class, args);
        }
    
        @Bean
        public CommandLineRunner cmd(MyProperties props) {
            return args -> {
                System.out.println("myMap: " + props.getMyMap());
                System.out.println("justmap: " + props.getJustmap());
            };
        }
    
        @ConfigurationProperties(prefix = "my.app")   
        static class MyProperties {
            private Map<String, String> myMap;
            private Map<String, String> justmap;
    
            public Map<String, String> getMyMap() {
                return myMap;
            }
            public void setMyMap(Map<String, String> myMap) {
                this.myMap = myMap;
            }
            public Map<String, String> getJustmap() {
                return justmap;
            }
            public void setJustmap(Map<String, String> justmap) {
                this.justmap = justmap;
            }
    
        }
    
    }
    

    输出如下

    2019-09-04 16:00:07.336  INFO 21204 --- [           main] c.e.demo.TestSpringBootApplication       : Started TestSpringBootApplication in 1.012 seconds (JVM running for 2.219)
    myMap: {a1=a, a2=b}
    justmap: {a1=a, a2=b}
    

    有关此宽松绑定规则的更多详细信息,请查看文档here

    【讨论】:

      【解决方案2】:

      详细说明 Shailendra 的答案,这里引用了来自 docs 的相关引述:

      要将规范形式的属性名称转换为环境变量名称,您可以遵循以下规则:

      • 将点 (.) 替换为下划线 (_)。
      • 删除所有破折号 (-)。
      • 转换为大写。

      【讨论】:

        猜你喜欢
        • 2015-10-22
        • 2013-07-28
        • 2023-02-10
        • 2018-04-05
        • 1970-01-01
        • 2021-08-23
        • 2017-12-01
        • 2021-11-09
        • 1970-01-01
        相关资源
        最近更新 更多