2016-08-27 1 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 

あなたが見ることができるように、車はリストですが、車デフォルトではありません。私が知っているのは、デフォルトのプロファイルを "flattened"レイアウトがアクティブなプロファイルと一致するように定義すると、Springは2つのプロファイルをうまくマージして、アクティブなプロファイルで定義されたプロパティがデフォルトを上書きするようにします。

私の挑戦は、結果の性質はこのように終わるので、私は、各Listオブジェクトを上書きするデフォルトの単一セットをしたいということですので、問題はもう少し複雑にするために

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オブジェクトを単純に設定し、その両方のマージ操作を適用することはできません。

本質的には、私が必要とするのは、の前にの2つのプロパティセットがマージされ、Carオブジェクトの値をインスタンス化して設定することです。

私は、Springのプロパティ・リゾルバを利用して、デフォルトの動作を上書きできる方法があることを期待していますが、Springのこの側面について十分な知識はありません。始めること。

+0

あなたの声明「見ることができるように、車はリストですが、車のデフォルトはありません」は、「あなたが見ることができるように*車の値はシーケンスですが、 * cars-defaultの値は "ではありません。両方の値はシーケンスです。 'cars'は文字列としてロードされるスカラーで、' cars-default'もそうです。 これらは両方とも、YAML構成ファイルの** 2つの**ドキュメントの最上位レベルのマッピングのキーです。 YAMLには 'List'という概念はありません。 'List'は、JavaプログラムでYAMLファイルをロードするときにシーケンスが表現されるものです。あなたの2番目の "ファイル"は無効ですYAML – Anthon

+0

申し訳ありませんが、非常に深夜にYAMLを間違って入力しました。これは修正されました。 BTW - 車のデフォルトをシーケンスに変更し、キーを単に "cars:"に変更すると、Springはアクティブ(マスタ)プロファイルのFIRSTシーケンスとデフォルトをマージしますが、残りのものはマージしません。それが可能であれば、私がSpringを介してプログラムで達成しようとしていることです。 – bitstream

答えて

0

YAMLパーサーがサポートしている場合は、標準のYAMLアンカーとエイリアスとthe merge key機能を使用できます。この:あなたが使用しているかのよう互換性のパーサで

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ドキュメント(あなたは2を持っている)で定義され、それが使われている前に、 (*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

Cool。ありがとう!私は月曜日にそれを試みます。うまくいけば私のYAMLパーサーが協力してくれることを願っています。:) – bitstream

+0

私は3つの提案をすべて試しましたが、うまくいきませんでした。 SpringのConfigurationPropertiesプロセッサはアンカーを無視しているようです。これはyamlを.propertiesファイルのフォーマットと一致させ、デフォルトプロファイル(存在する場合)をアクティブとしてマークされたプロファイルとマージするように、yamlを平坦化します。 残念ながら、マージが発生するためにプロパティ名の点で1対1のマッチングが必要なようです。 :/ – bitstream

+0

@bitstream残念ながら、私は今は何も示唆していません。 – Anthon

関連する問題