SpringBootの階層の深いapplication.ymlをrecordで取り出す

エキサイト株式会社メディア事業部エンジニアの佐々木です。Javaにrecord型が登場し、SpringBootでも結構いろいろなところで使用できるようになりました。今回は、application.ymlからrecordを使用して取り出す方法になります。

前提

環境は下記になります。

$ java --version
openjdk 21.0.2 2024-01-16 LTS
OpenJDK Runtime Environment Corretto-21.0.2.13.1 (build 21.0.2+13-LTS)
OpenJDK 64-Bit Server VM Corretto-21.0.2.13.1 (build 21.0.2+13-LTS, mixed mode, sharing)


$ ./gradlew --version

------------------------------------------------------------
Gradle 8.6
------------------------------------------------------------

Build time:   2024-02-02 16:47:16 UTC
Revision:     d55c486870a0dc6f6278f53d21381396d0741c6e

Kotlin:       1.9.20
Groovy:       3.0.17
Ant:          Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM:          21.0.2 (Amazon.com Inc. 21.0.2+13-LTS)
OS:           Mac OS X 12.5 aarch64

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v3.2.3)

application.yml

取り出したいapplication.ymlの情報は下記になります。アプリケーション内で使用する国情報みたいなデータです。

jp:
  co:
    excite:
      country:
        - name: japan
          lang:
            - ja
          data:
            population: 126000000
            capital: tokyo
            currency: yen
            timezone: Asia/Tokyo
        - name: united states
          lang:
            -  en
          data:
            population: 328000000
            capital: washington
            currency: dollar
            timezone: America/New_York

コード

コードとしては、下記になります。

@ConfigurationProperties(prefix = "jp.co.excite")
public record LangListConfig (List<CountryType> country) {
    record CountryType(String name, List<String> lang, CountryData data) {
        record CountryData(String population, String capital, String currency, String timezone) {}
    }
}

// 出力
LangListConfig[
  country=[
    CountryType[name=japan, lang=[ja], data=CountryData[population=126000000, capital=tokyo, currency=yen, timezone=Asia/Tokyo]],
    CountryType[name=united states, lang=[en], data=CountryData[population=328000000, capital=washington, currency=dollar, timezone=America/New_York]]
  ]
]

SpringBoot3系だと、この行数でタイプセーフに記述することが可能です。設定ファイルがいくらネストしていても、同じようにrecordをネストすれば取り出せます。

まとめ

SpringBootで利用しているライブラリは、SnakeYAMLで結構いろいろできます。どんどんタイプセーフにしていきましょう。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com