如何在 kotlin 中为基本类型使用 spring 注释,如 @Autowired 或 @Value?
how to use spring annotations like @Autowired or @Value in kotlin for primitive types?
使用 spring 注释自动装配非基元,例如
@Autowired
lateinit var metaDataService: MetaDataService
有效。
但这行不通:
@Value("${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
出现错误:
lateinit modifier is not allowed for primitive types.
如何将原始属性自动装配到 kotlin 中 类?
问题不在于注释,而是基元和 lateinit
的混合,根据 ,Kotlin 不允许 lateinit
基元。
解决方法是更改为可空类型 Int?
,或者不使用 lateinit
。
This TryItOnline 显示问题。
Kotlin 在 java 代码中将 Int 编译为 int。 Spring 想要非原始类型进行注入,所以你应该使用 Int? / 布尔值? / 长?等等。可空类型 kotlin 编译为 Integer / Boolean / etc.
@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
或使用构造函数注入
@Component
class Main(@Value("${a}") val a: Int) : CommandLineRunner {
override fun run(vararg args: String) {
println(a)
}
}
我只是用 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 注释:
class Test(
@Value("${my.value}")
private val myValue: Long
) {
//...
}
这样做的好处是您的变量是最终的并且 none 可以为 null。我也更喜欢构造函数注入。它可以使测试更容易。
没有默认值和外部构造函数
发件人:
@Value("${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
收件人:
@delegate:Value("${cacheTimeSeconds}") var cacheTimeSeconds by Delegates.notNull<Int>()
祝你好运
Kotlin doesn't have primitive type
使用 spring 注释自动装配非基元,例如
@Autowired
lateinit var metaDataService: MetaDataService
有效。
但这行不通:
@Value("${cacheTimeSeconds}")
lateinit var cacheTimeSeconds: Int
出现错误:
lateinit modifier is not allowed for primitive types.
如何将原始属性自动装配到 kotlin 中 类?
问题不在于注释,而是基元和 lateinit
的混合,根据 lateinit
基元。
解决方法是更改为可空类型 Int?
,或者不使用 lateinit
。
This TryItOnline 显示问题。
Kotlin 在 java 代码中将 Int 编译为 int。 Spring 想要非原始类型进行注入,所以你应该使用 Int? / 布尔值? / 长?等等。可空类型 kotlin 编译为 Integer / Boolean / etc.
@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
或使用构造函数注入
@Component
class Main(@Value("${a}") val a: Int) : CommandLineRunner {
override fun run(vararg args: String) {
println(a)
}
}
我只是用 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 注释:
class Test(
@Value("${my.value}")
private val myValue: Long
) {
//...
}
这样做的好处是您的变量是最终的并且 none 可以为 null。我也更喜欢构造函数注入。它可以使测试更容易。
没有默认值和外部构造函数
发件人:
@Value("${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
收件人:
@delegate:Value("${cacheTimeSeconds}") var cacheTimeSeconds by Delegates.notNull<Int>()
祝你好运
Kotlin doesn't have primitive type