Sping Bootで設定値を取得する初歩的な方法をお伝えします。
リクエスト内容に対応する設定値を返却する簡素なREST APIを題材にします。
なお、本投稿のソースコードはKotlinで記述しております。
準備
Spring Bootにおいて設定値は基本的にapplication.propertiesまたはapplication.ymlに記述します。
今回は以下のように設定値を記述します。
colors:
red: あか
blue: あお
fruits:
prices:
apple: 150
orange: 100
この設定値をソースコードから取得したいと思います。
Propertiesクラス
各設定値を格納するBeanクラスを作成します。
私はこのクラス作成するときに***Properties.ktと名前をつけています。
例えば前述のapplication.ymlのcolors項であれば以下のように作成します。
@Component // 1
@ConfigurationProperties(prefix = "colors") // 2
class PlatformProperties {
lateinit var red: String // 3
lateinit var blue: String // 3
}
- BeanクラスとしてDIコンテナにのせるため記述しています。
- こちらのアノテーションを付与することで、クラスのプロパティに設定ファイル(application.yml)から自動的に値を挿入します。またprefixパラメータを渡すことで、今回であればcolors項のみを取得します。なお、現状ではプロパティをvalで定義できず、lateinit varで定義する必要があります。(参考)
- 2のアノテーションにより自動的に設定値が挿入されます。ただし、プロパティと設定ファイル間での名前や型が一致している必要があります。
同様にfruits項も以下のようにPropertiesクラスを作成します。
@Component
@ConfigurationProperties(prefix = "fruits")
class FruitProperties {
lateinit var prices: Map<String, Int>
}
こちらは設定ファイルのfruits項がcolors項よりネストが1段深くなっているため、Mapでプロパティを定義しています。
取得
ここまでで準備は整いました。あとは作成したPropertiesクラスから設定値を取得するだけです。
試しに以下のようなControllerクラスを作成します。
@RestController
class Controller(
val colorProperties: PlatformProperties,
val fruitProperties: FruitProperties // 1
) {
@GetMapping("colors/red")
fun translateColorToJapanese(): String {
return colorProperties.red // 2
}
@GetMapping("fruits/price/{fruit}")
fun getFruitPrice(@PathVariable fruit: String): String {
return "${fruitProperties.prices.get(fruit)}円です" // 3
}
}
- 作成したPropertiesクラスをコンストラクタインジェクションして使えるようにします。
- 設定ファイルのcolors項よりredを呼び出し
- 設定ファイルのfruits項よりリクエストに応じたpriceを呼び出し
このアプリケーションを実行すると以下のように結果を得ることができます。
$ curl http://localhost:8080/colors/red
あか
$ curl http://localhost:8080/fruits/price/orange
100円です
まとめ
今回はSping Bootで設定値を取得する初歩的な方法をお伝えしました。
application.yml以外の設定ファイルから取得する方法や、プロファイル(環境変数)により取得する設定ファイルを変更する方法はまた別の機会にご紹介できればと思います。