在驼峰式情况下,Spring Boot 不会从环境变量加载 Map

ttu*_*lka 5 java spring-boot

我设置了环境变量

MY_APP_MY_MAP_A1=a
MY_APP_MY_MAP_A2=b
MY_APP_JUSTMAP_A1=a
MY_APP_JUSTMAP_A2=b
Run Code Online (Sandbox Code Playgroud)

通过以下方式配置我的 Spring Boot (2.1.7.RELEASE) 应用程序@ConfigurationProperties

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当变量名包含大写字母(驼峰式)时,设置 aMap<String,String>不起作用,否则一切正常:

myMap: null
justmap: {a1=a, a2=b}
Run Code Online (Sandbox Code Playgroud)

有办法怎么做吗?

Sha*_*dra 6

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

MY_APP_MYMAP_A1=a
MY_APP_MYMAP_A2=b
MY_APP_JUSTMAP_A1=a
MY_APP_JUSTMAP_A2=b
Run Code Online (Sandbox Code Playgroud)

下面的代码打印您所期望的内容

@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;
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出如下

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}
Run Code Online (Sandbox Code Playgroud)

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