簡體   English   中英

帶有 Spring DI 的 Kotlin:lateinit 屬性尚未初始化

[英]Kotlin with Spring DI: lateinit property has not been initialized

我在 Kotlin 中沒有讓基於 Spring 的 setter 依賴注入工作,因為它總是以錯誤消息“lateinit property api has not been initialized”終止。 我可以將問題簡化為以下場景:有一個接口

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()
}

在主函數中,我加載應用程序上下文並調用方法:

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

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

這里有什么問題?

如果您像這樣自己調用構造函數,則不涉及 Spring。 和Java一樣,

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

Spring Framework 5.0 添加了Kotlin 擴展,因此您也可以編寫以下任一

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

您的 api 目前不是 spring 管理的 bean,請嘗試使用 @Service 或 @Component 對其進行注釋

@Autowired通常被添加到@Autowired的設置器中。 因此,不應將其用於屬性,而應顯式注釋 setter:

@set:Autowired lateinit var api: IApi

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM