2017-08-24 21 views
2

我使用Spring 1.5.6引導和具有配置屬性如下:春季啓動 - 地圖財產的合併地圖

@Component 
@Getter 
@Setter 
@ConfigurationProperties("test") 
public class TestProperties { 
    private Map<Integer, Integer> map; 
    private Map<String, Map<Integer, Integer>> mapOfMaps; 
} 

和兩個YAML配置文件:

application.yml

test: 
    map: 
    1: 10 
    2: 20 
    mapOfMaps: 
    KEY1: 
     1: 10 
     2: 20 
    KEY2: 
     3: 30 
     4: 40 

application-dev.yml

test: 
    map: 
    100: 100 
    mapOfMaps: 
    KEY1: 
     100: 100 

當我用dev配置文件運行我的應用程序時,我預計這兩個屬性將僅包含dev配置文件值(因此基本上完全匹配application-dev.yml)。

示例項目,請訪問:https://github.com/poznachowski/spring-boot-mapmerge

對於簡單map屬性它工作得很好,但對於一個mapOfMaps屬性解析到{KEY1={100=100}, KEY2={3=30, 4=40}}

這是否表現出設計?如果是的話,有沒有辦法讓我的工作方式我描述?

回答

1

這是按設計工作。 application.yml可以被視爲提供其他配置文件覆蓋的默認值。

基本上,基本配置將與您啓用的配置文件合併,但活動配置文件中的鍵將取代默認配置文件中的鍵。

Spring Boot - Properties & configuration documentation

當我和春天開機1.5.6.RELEASE運行你的例子所產生的配置對象如下所示:

test: 
    map: 
    1: 10 
    2: 20 
    100: 100 
    mapOfMaps: 
    KEY1: 
     1:10 
     2:20 
     100:100 
    KEY2: 
     3: 30 
     4: 40 

如果你想有任一方或另一方配置活躍您必須將第一個應用程序放在另一個應用程序 - {profile} .yml中,或者確保您覆蓋默認配置中的每個屬性。

+0

你在說什麼不對。以下是示例項目:https://github.com/poznachowski/spring-boot-mapmerge 當您使用dev配置文件運行它時,您將獲得我寫的內容: '以下配置文件處於活動狀態:dev'。 'map' - >'{100 = 100}''mapOfMaps' - >'{KEY1 = {100 = 100},KEY2 = {3 = 30,4 = 40}}' (並且在文檔中明確指出)。 –

+0

我認爲你可能偶然發現了一個bug,Spring並沒有很好地處理數字鍵。我認爲它與[SPR-13398](https://jira.spring.io/browse/SPR-13398?jql=project%20%3D%20SPR%20AND%20text%20~%20%22yaml%22)有關)。我已更新您的示例以證明這一點:https://github.com/johannbre/spring-boot-mapmerge。只要將配置條目的鍵用引號引起來,代碼就會按預期運行。 –

+0

另外,這也只發生在YAML配置中。我試過這個屬性文件,並且代碼的行爲與預期一樣,不需要用引號括住關鍵字。 –