Java 如何使用Spring Boot从环境变量自定义属性绑定

Java 如何使用Spring Boot从环境变量自定义属性绑定,java,spring,spring-boot,Java,Spring,Spring Boot,我希望将绑定属性从环境变量获取到映射。如果在应用程序中定义了属性。属性绑定工作正常。但如果属性定义为ENV变量,绑定将失败 考虑以下示例: @ConfigurationProperties("com.test") public class Props { private Map<String, Map<String, String>> property; } 但绑定失败了 Failed to convert property value of type 'jav

我希望将绑定属性从环境变量获取到映射。如果在
应用程序中定义了属性。属性
绑定工作正常。但如果属性定义为ENV变量,绑定将失败

考虑以下示例:

@ConfigurationProperties("com.test")
public class Props {
    private Map<String, Map<String, String>> property;
}
但绑定失败了

Failed to convert property value of type 'java.lang.String' to required type 'java.util.Map' for property 'property[FOO_BAR]'; nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Map' for property 'property[FOO_BAR]': no matching editors or conversion strategy found

基于此,我还尝试创建一个自定义的
转换器
,并使用
@ConfigurationPropertiesBinding
注册它,但使用这种方法,我无法访问密钥,只能访问值

我还尝试注册custom
PropertyEditor
,但它似乎没有注册,也许应该以不同的方式注册

@Bean
@ConfigurationPropertiesBinding
public CustomEditorConfigurer customEditorConfigurer() {
    CustomEditorConfigurer pe = new CustomEditorConfigurer();
    pe.setCustomEditors(Collections.singletonMap(Map.class, KeyPropertyEditor.class));
    return pe;
}
你可以用这个试试


编辑1 我已经提高了


编辑2


它将在Spring Boot 2中修复编辑:关于您真正想要的:将以下内容用作application.properties文件

com.test.some.key=${COM_TEST_PROPERTY_SOME_KEY}
com.test.other.key=${COM_TEST_PROPERTY_OTHER_KEY}
我知道这很麻烦,但它应该会起作用


您还可以从COM_TEST_属性开始对每个属性进行后期处理,解析它们,将它们拆分为您想要的路径,并将它们注入到您的环境中,但这需要更多的代码。

啊,我误解了,您想在单个环境变量中导入整个属性名称空间吗?我觉得不可能,我试过了。转换器不起作用。因为你只能访问一个值。因此,在这种情况下,它将被保存为
[property={FOO\u BAR=VALUE}]
您可以拥有一个早期配置文件,该文件将加载整个映射并将每个子键重新注入到环境中。从配置文件(
application.properties
)中绑定可以正常工作。我需要外部化的配置-EVN变量。我也提出了,因为绑定不一致。是的,我终于明白了。但是,每个属性都应该有一个环境变量。不是单个变量中属性路径和值的映射。您可以通过将映射绑定到环境变量并在启动期间手动将每个子键注入到您的环境中来解决这个问题,但我认为这是一个糟糕的设计。我之所以需要这样做,是因为
COM\u TEST\u PROPERTY\uuuuuu
=VALUE感谢您的帮助
com.test.some.key=${COM_TEST_PROPERTY_SOME_KEY}
com.test.other.key=${COM_TEST_PROPERTY_OTHER_KEY}