spring-boot-configuration
Spring Boot で application.yml を Kotlin でバインディングできるようにしたい
環境
- Spring Boot 2.4.0
- Kotlin 1.4.10
きっかけ
Spring Bootでは環境別に設定を切り替える仕組みとしてapplication.propertiesやapplication.ymlファイルを使えます。 application.ymlにカスタムプロパティを書きたい。
読み込む方法は主に2つ
@Value
@ConfigurationProperties
@Value
の場合
ApiConfiguration.kt
@Configuration
class ApiConfiguration(
@Value("\${api.url}") url: String,
){
@Bean
fun apiClient(): RestOperations = RestTemplateBuilder()
.rootUri(url)
.build()
}
application.yml
api:
url: "http://api.example.com"
これで設定できるが、application.ymlで以下の警告がでる。
Cannot resolve configuration property 'api.url'
それに、propertyがどこで使われているかや、型や説明がコードで明確になっていたほうが嬉しい おすすめなのは以下
@ConfigurationProperties
の場合
https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-constructor-binding https://spring.pleiades.io/guides/tutorials/spring-boot-kotlin/
ApiConfiguration.kt
これだけだとバインドされないので、機能を有効化する必要がある
もしくは @Configuration
クラスに個別に指定する
補完が効くようにする
カスタムプロパティをIDEに認識させるためには、 META-INF/spring-configuration-metadata.json
が存在する必要がある。
build.gradle.kts
dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
}
Intellijでは、 Preferences | Build, Execution, Deployment | Compiler | Annotation Processors
で Enable annotation processing
を有効にするとビルド時に生成されるようになるとあるが、自分の環境では生成されなかった。
ドキュメントをよく見たら、Kotlinの場合 kapt
が必要とのこと
https://spring.pleiades.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-kotlin-configuration-properties
build.gradle.kts
plugins {
...
kotlin("kapt") version "1.4.10"
}
dependencies {
...
kapt("org.springframework.boot:spring-boot-configuration-processor")
}
kaptタスクを実行
自分の環境では build/tmp/kapt3/classes/main/META-INF/spring-configuration-metadata.json
に作成された