[SpringBoot/KotlinでBFF]プロパティ定義した@Valueが読み込まれない

application.ymlで設定した値を@Valueでクラスに定義したら読み込まれていないようでハマった。初期化ブロックのinit内でprintlnで出力してみるとやはりデフォルト値になっていて読み込まれていなかった。

external:
  task:
    connect-timeout-millis: 3000
    read-timeout-millis: 3000
@Repository
class TaskRepository(restTemplateBuilder: RestTemplateBuilder) {

    @Value("\${external.task.connect-timeout-millis}")
    val connectTimeoutMillis: Long = 0

    @Value("\${external.task.read-timeout-millis}")
    val readTimeoutMillis: Long = 0

    private var restTemplate: RestTemplate? = null

    init {
        println("connectTimeoutMillis : $connectTimeoutMillis ms")
        println("readTimeoutMillis : $readTimeoutMillis ms")

        restTemplate = restTemplateBuilder
                .setConnectTimeout(Duration.ofMillis(connectTimeoutMillis))
                .setReadTimeout(Duration.ofMillis(readTimeoutMillis))
                .build()
    }
2020-12-17 08:24:15.152  INFO 1791 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2087 ms

connectTimeoutMillis : 0 ms
readTimeoutMillis : 0 ms

意図的にReadTimeoutを発生させて実際の動作を確認してみると、readTimeoutMillisが効いてる時と効いていない時があった。なのでタイミングによって読み込みの動作が変わってしまうように見える。

以下のように、プライマリーコンストラクタ内で@Valueを定義するように修正

@Repository
class TaskRepository(restTemplateBuilder: RestTemplateBuilder,
                     @Value("\${external.task.connect-timeout-millis}") private val connectTimeoutMillis: Long,
                     @Value("\${external.task.read-timeout-millis}") private val readTimeoutMillis: Long
) {

結果は常に読み込まれている事を確認できた。実際の動作も正しくtimeoutが効いている。

2020-12-17 08:33:44.295  INFO 1843 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1640 ms

connectTimeoutMillis : 3000 ms
readTimeoutMillis : 3000 ms

参考
Spring公式 2.7. Type-safe Configuration Properties ここに書いてあると思われるけどいまいち分からなかったので要調査。




ARでToDoを楽しく管理
iPhone用スマホアプリ
「Air ToDo」

空間上で楽しく管理するAR ToDoリストです。
チェックマークに3Dのパンダが使えるようになりました。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です