次のようなスプリングアノテーションで非プリミティブを自動配線する
@Autowired
lateinit var metaDataService: MetaDataService
動作します。
しかし、これは機能しません:
@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
エラーあり:
lateinit修飾子は、プリミティブ型には使用できません。
Primitveプロパティをkotlinクラスに自動配線する方法は?
@Value( "\ $ {cacheTimeSeconds}")lateinit var cacheTimeSeconds:Int
あるべき
@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
デフォルト値を設定してみてください
@Value("\${a}")
val a: Int = 0
application.propertiesで
a=1
コード内
package com.example.demo
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.stereotype.Component
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
runApplication<DemoApplication>(*args)
}
@Component
class Main : CommandLineRunner {
@Value("\${a}")
val a: Int = 0
override fun run(vararg args: String) {
println(a)
}
}
1
または、constructctor injectを使用します
@Component
class Main(@Value("\${a}") val a: Int) : CommandLineRunner {
override fun run(vararg args: String) {
println(a)
}
}
KotlinはIntをintにJavaコードでコンパイルします。Springはインジェクションに非プリミティブ型が必要なため、Int?/ Boolean?/ Long?などを使用する必要があります。 /など.
問題は注釈ではなく、プリミティブとlateinit
の組み合わせです。 この質問 により、Kotlinはlateinit
プリミティブを許可しません。
修正方法は、null許容型Int?
に変更するか、lateinit
を使用しないことです。
これTryItOnline は問題を示しています。