使用spring annotations自动装配一个非基本体,如bellow工作:
@Autowired lateinit var metaDataService: MetaDataService
但这行不通:
@Value("\${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Int
错误:基元类型不允许使用lateinit修饰符。如何将primitve属性自动连接到Kotlin类中?
r3i60tvu1#
你也可以在构造函数中使用@Value注解:
class Test( @Value("\${my.value}") private val myValue: Long ) { //... }
这样做的好处是,你的变量是final的,不可为空。我也喜欢构造函数注入。它可以使测试更容易。
hwazgwia2#
@Value(“${cacheTimeSeconds}”)lateinit var cacheTimeSeconds:国际应该是
@Value("\${cacheTimeSeconds}") val cacheTimeSeconds: Int? = null
bis0qfac3#
我只是使用了Number而不是Int:
Number
Int
@Value("\${cacheTimeSeconds}") lateinit var cacheTimeSeconds: Number
其他选项是做其他人之前提到的事情:
@Value("\${cacheTimeSeconds}") var cacheTimeSeconds: Int? = null
或者,您可以简单地提供一个默认值,如:
@Value("\${cacheTimeSeconds}") var cacheTimeSeconds: Int = 1
在我的例子中,我必须获取一个Boolean类型的属性,这是Kotlin中的原始类型,所以我的代码看起来像这样:
Boolean
@Value("\${myBoolProperty}") var myBoolProperty: Boolean = false
wswtfjt74#
尝试设置默认值
@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或使用constructor注入
1
@Component class Main(@Value("\${a}") val a: Int) : CommandLineRunner { override fun run(vararg args: String) { println(a) } }
70gysomp5#
出发地:
收件人:
@delegate:Value("\${cacheTimeSeconds}") var cacheTimeSeconds by Delegates.notNull<Int>()
祝你好运Kotlin doesn't have primitive type
zu0ti5jz6#
Kotlin在Java代码中将Int编译为int。Spring想要注入非原始类型,所以你应该使用Int?/ Boolean?/ Long?可空类型Kotlin编译为整数/布尔/等。
tyky79it7#
问题不是注解,而是原语和lateinit的混合,按照this question,Kotlin不允许lateinit原语。修复方法是更改为可空类型Int?,或者不使用lateinit。这个 TryItOnline 显示了问题。
lateinit
Int?
7条答案
按热度按时间r3i60tvu1#
你也可以在构造函数中使用@Value注解:
这样做的好处是,你的变量是final的,不可为空。我也喜欢构造函数注入。它可以使测试更容易。
hwazgwia2#
@Value(“${cacheTimeSeconds}”)lateinit var cacheTimeSeconds:国际
应该是
bis0qfac3#
我只是使用了
Number
而不是Int
:其他选项是做其他人之前提到的事情:
或者,您可以简单地提供一个默认值,如:
在我的例子中,我必须获取一个
Boolean
类型的属性,这是Kotlin中的原始类型,所以我的代码看起来像这样:wswtfjt74#
尝试设置默认值
在application.properties
在代码中
它将打印
1
或使用constructor注入
70gysomp5#
不带默认值和外部构造函数
出发地:
收件人:
祝你好运
Kotlin doesn't have primitive type
zu0ti5jz6#
Kotlin在Java代码中将Int编译为int。Spring想要注入非原始类型,所以你应该使用Int?/ Boolean?/ Long?可空类型Kotlin编译为整数/布尔/等。
tyky79it7#
问题不是注解,而是原语和
lateinit
的混合,按照this question,Kotlin不允许lateinit
原语。修复方法是更改为可空类型
Int?
,或者不使用lateinit
。这个 TryItOnline 显示了问题。