2017-04-14 80 views
2

我想從環境變量綁定屬性到地圖。如果在application.properties中定義了一個屬性,則綁定可以正常工作。但是如果該屬性被定義爲ENV變量綁定失敗。如何使用Spring引導自變量變量自定義屬性綁定

考慮下面的例子:

@ConfigurationProperties("com.test") 
public class Props { 
    private Map<String, Map<String, String>> property; 
} 

以下ENV變量有望被映射爲一個地圖[property={foo={bar=VALUE}}]

export COM_TEST_PROPERTY_FOO_BAR=VALUE 

但結合故障

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 

基於documentation我還試圖創建一個自定義Converter和使用@ConfigurationPropertiesBinding註冊,但這種做法我不能夠訪問鍵,只是價值觀。

我還試圖註冊自定義PropertyEditor,但看起來是沒有得到註冊,也許應該以不同的方式註冊?

@Bean 
@ConfigurationPropertiesBinding 
public CustomEditorConfigurer customEditorConfigurer() { 
    CustomEditorConfigurer pe = new CustomEditorConfigurer(); 
    pe.setCustomEditors(Collections.singletonMap(Map.class, KeyPropertyEditor.class)); 
    return pe; 
} 

你可以嘗試一下用這個Demo app


編輯1 我提出an issue


編輯2

它將被固定在Spring Boot 2中

+0

啊,我誤解了,你想在一個單一的環境變量中導入一個完整的命名空間屬性?我不認爲這是可能的。 –

回答

0

編輯:關於你真正想要的:使用以下作爲你的application.properties文件。

com.test.some.key=${COM_TEST_PROPERTY_SOME_KEY} 
com.test.other.key=${COM_TEST_PROPERTY_OTHER_KEY} 

我知道這很麻煩,但它應該做的伎倆。

您也可以後期過程COM_TEST_PROPERTY開始每性質,解析它們,將它們拆成你想要的路徑,並將其注入到你的環境但這需要更多的代碼。

+0

我試過這個。轉換器沒有幫助。因爲你只能訪問一個值。所以在這種情況下,它被保存爲'[屬性= {foo_bar這樣的名稱= VALUE}]' –

+0

你可以有,將加載整個地圖,每個子項重新注入到環境中的早期配置文件。 –

+0

綁定工作正確地形成配置文件('application.properties')。我需要外部配置 - EVN變量。我也提出了** [問題](https://github.com/spring-projects/spring-boot/issues/8902)**,因爲綁定是不相符的。 –