使用弹簧注释自动装配非基元,例如
@Autowired
lateinit var metaDataService: MetaDataService
作品。
但这不起作用:
@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
有一个错误:
原始类型不允许使用 lateinit 修饰符。
如何将原始属性自动装配到 kotlin 类中?
使用弹簧注释自动装配非基元,例如
@Autowired
lateinit var metaDataService: MetaDataService
作品。
但这不起作用:
@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
有一个错误:
原始类型不允许使用 lateinit 修饰符。
如何将原始属性自动装配到 kotlin 类中?
您还可以在构造函数中使用 @Value 注释:
class Test(
@Value("\${my.value}")
private val myValue: Long
) {
//...
}
这样做的好处是您的变量是最终的且不可为空。我也更喜欢构造函数注入。它可以使测试更容易。
@Value("\${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
应该
@Value("\${cacheTimeSeconds}")
val cacheTimeSeconds: Int? = null
我只是使用Number
而不是Int
像这样......
@Value("\${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Number
其他选择是做其他人之前提到的......
@Value("\${cacheTimeSeconds}")
var cacheTimeSeconds: Int? = null
或者您可以简单地提供一个默认值,例如...
@Value("\${cacheTimeSeconds}")
var cacheTimeSeconds: Int = 1
在我的情况下,我必须获得一个Boolean
在 Kotlin 中是原始类型的属性,所以我的代码看起来像这样......
@Value("\${myBoolProperty}")
var myBoolProperty: Boolean = false
尝试设置默认值
@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
或使用构造函数注入
@Component
class Main(@Value("\${a}") val a: Int) : CommandLineRunner {
override fun run(vararg args: String) {
println(a)
}
}
问题不在于注释,而是原语和 的混合lateinit
,根据这个问题,Kotlin 不允许lateinit
原语。
解决方法是更改为可为空的类型Int?
,或者不使用lateinit
.
这个TryItOnline显示了这个问题。
Kotlin 在 Java 代码中将 Int 编译为 int。Spring 想要非原始类型进行注入,所以你应该使用 Int? /布尔?/ 长?等等。可空类型 kotlin 编译为 Integer / Boolean / etc。
从:
@Value("\${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
到:
@delegate:Value("\${cacheTimeSeconds}") var cacheTimeSeconds by Delegates.notNull<Int>()
祝你好运