带有Spring DI的Kotlin:lateinit属性尚未初始化

时间:2017-11-09 14:45:14

标签: spring dependency-injection kotlin kotlin-lateinit

我没有在Kotlin中使用基于Spring的setter依赖注入来工作,因为它始终以错误消息“lateinit property api尚未初始化”终止。我可以将问题减少到以下场景:有一个接口

interface IApi {
  fun retrieveContent(): String
}

实现
class Api : IApi {
    override fun retrieveContent() = "Some Content"
}

我想在另一个应该进行依赖注入的类中使用该实现:

@Component
class SomeController {
    @Autowired lateinit var api: IApi
    fun printReceivedContent() {
        print(api.retrieveContent())
    }
}

但是,应用程序终止时会出现上述错误消息。我的Spring配置如下:

@Configuration
open class DIConfig {
    @Bean
    open fun getApiInstance(): IApi = Api()
}

在main函数中,我加载应用程序上下文并调用方法:

fun main(args: Array<String>) {
    val context = AnnotationConfigApplicationContext()
    context.register(DIConfig::class.java)
    context.refresh()

    val controller = SomeController()
    controller.printReceivedContent()
}

这里有什么问题?

3 个答案:

答案 0 :(得分:0)

@Autowired通常会添加到属性的setter中。因此,不应将其用于属性,而应明确注释setter:

@set:Autowired lateinit var api: IApi

答案 1 :(得分:0)

如果您只是自己调用构造函数,那么Spring就不会参与其中。与Java相同,

val controller = context.getBean(SomeController::class.java)

Spring Framework 5.0添加了Kotlin extensions,因此您也可以编写其中一个

val controller = context.getBean<SomeController>()
val controller: SomeController = context.getBean()

答案 2 :(得分:0)

你的api目前不是spring管理的bean,尝试用@Service或@Component注解