2016-08-27 109 views
0

基於YAML的配置默認我有一個YAML配置文件,如下所示:問題,在春季啓動項目

spring.profiles: master 
cars: 
    - 
    color: red 
    style: sedan 
    doors: 4 
    - 
    color: blue 
    doors: 4 
    - 
    color: black 
--- 
spring.profiles: default 
cars-default: 
    color: not specified 
    style: not specified 
    doors: not specified 

正如你所看到的,汽車是一個列表,但汽車,默認是沒有的。我知道,如果你定義默認配置文件使得「扁平化」的佈局相匹配的活動配置文件,春天會很樂意合併這兩個配置文件,使得活動配置文件定義的屬性將覆蓋默認值。

我的挑戰是,我想要一個默認設置覆蓋每個列表對象的,因此所得到的性能最終是這樣的:

cars: 
    - 
    color: red 
    style: sedan 
    doors: 4 
    - 
    color: blue 
    style: not specified 
    doors: 4 
    - 
    color: black 
    style: not specified 
    doors: not specified 

使事情稍微複雜一些,在汽車的POJO這些屬性映射到了硬編碼自己,我不能覆蓋的默認值,所以只需填充一個Car對象和DefaultCar對象,並應用在兩個合併操作將無法正常工作。

本質上,我需要發生的是這兩組屬性合併之前實例化和設置Car對象的值。

我希望有一種方法,我能夠領略到春天的屬性解析器,這樣我可以覆蓋默認行爲,雖然我不是非常有春天的這個方面不夠熟悉,所以我真的不知道在哪裏開始。

+0

你的聲明「正如你所看到的,汽車是一個列表,但汽車,默認是不」是假的,即使你把它改寫爲「如你所見,*爲*汽車的價值是有順序的,但* * cars-default的值不是「。這兩個值都是序列。 'cars'是一個以字符串形式加載的標量,'cars-default'也是。 他們是在你的YAML配置文件中的** 2個**文件,每個頂級映射的兩個鍵。 YAML沒有名爲'List'的概念。 'List'是在Java程序中加載YAML文件時所表示的序列。您的第二個「文件」無效YAML – Anthon

+0

對不起,非常深夜,並錯誤地鍵入YAML。它已被修復。 順便說一句 - 如果我改變汽車默認的序列,改變的關鍵,只是「汽車」,Spring將合併默認與活動(主)配置文件中的第一個序列,而不是休息。這就是我試圖通過Spring以編程方式實現的,如果甚至可能的話。 – bitstream

回答

0

你可能只是能夠使用標準的YAML錨和別名和the merge key設施,如果您的YAML解析器支持它。這:

spring.profiles: master 
_: &car-default 
    color: not specified 
    style: not specified 
    doors: not specified 
cars: 
    - <<: *car-default 
    color: red 
    style: sedan 
    doors: 4 
    - <<: *car-default 
    color: blue 
    doors: 4 
    - <<: *car-default 
    color: black 

載荷兼容的解析器,如果你使用:

spring.profiles: master 
_: 
    color: not specified 
    style: not specified 
    doors: not specified 
cars: 
- color: red 
    style: sedan 
    doors: 4 
- color: blue 
    style: not specified 
    doors: 4 
- color: black 
    style: not specified 
    doors: not specified 

確保錨(&car-default)是一樣的YAML文件(你有兩個)中定義列表以及其中被使用之前, (與*car-default)。它不必被定義爲(頂級或其他)鍵的值,該映射可以是序列中的元素,例如,該序列的第一個元素是cars值:

spring.profiles: master 
cars: 
    - &car-default 
    color: not specified 
    style: not specified 
    doors: not specified 
    - <<: *car-default 
    color: red 
    style: sedan 
    doors: 4 
    - <<: *car-default 
    color: blue 
    doors: 4 
    - <<: *car-default 
    color: black 

當然春天將不得不忽略錨值的默認值,所以你可能需要找一些「評論」鍵值對和存儲這在價值部分。

+0

很酷。謝謝!我會在星期一嘗試。希望我的YAML解析器能夠合作。:) – bitstream

+0

我嘗試了所有3個建議,但都沒有工作。似乎Spring的ConfigurationProperties處理器忽略錨點。它所做的是平鋪yaml,使其匹配.properties文件的格式,然後嘗試合併默認配置文件(如果存在)和標記爲活動的任何配置文件。 不幸的是,它似乎希望進行合併發生的屬性名稱的一對一匹配。 :/ – bitstream

+0

@bitstream很抱歉聽到,不幸的是我現在沒有別的建議。 – Anthon