Spring Bootアプリケーションでは、環境変数を使って設定値を渡すことがよく行われます。
しかし、リストやマップのような複雑なデータ構造を環境変数で渡す場合、注意が必要。
今回は、Spring Bootでリストやマップ構造のプロパティを環境変数として渡す方法を自分用に書き溜めておきます。
先に環境変数
1 2 3 |
DATALIST_0_TAG=app DATALIST_0_GROUP-ID=gid DATALIST_0_ENDPOINT=http://localhost/call |
application.yml
例えば、application.yml
が下記のような感じ
1 2 3 4 5 |
dataList: - tag: app group-id: gid endpoint: http://localhost /call |
この設定ファイルでは、dataList
というリストがあり、リストの各要素にtag
, group-id
, endpoint
というプロパティが含まれています。
application.yml を環境変数へ変換
Spring Bootでは、環境変数を使用してapplication.ymlのプロパティを設定できますが、リストやマップ構造のプロパティを直接環境変数として渡すことはできません。
代わりに、それらの構造をフラットな形式に変換して設定する必要がある。
さっきの例では、次のように環境変数名を設定できます。
1 2 3 4 |
DATALIST_0_TAG=app DATALIST_0_GROUP-ID=gid DATALIST_0_ENDPOINT=http://localhost/call |
注意点として、リスト内の要素のインデックスを使用しないといけないので、「0」とか「1」とか指定している。
これらの環境変数を設定することで、application.ymlのプロパティが上書きされます。
考慮しないといけないこととして、
リストやマップのような複雑なデータ構造の場合、環境変数よりも、外部の設定ファイルを使用して設定を渡す方がシンプルで柔軟性がある。
環境変数でリストやマップを渡す場合は、インデックスが0から始まり、連続した整数値である必要がある。
じゃあね~~。