微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

@Autowired 但得到了 lateinit 属性 testBean 尚未初始化错误

如何解决@Autowired 但得到了 lateinit 属性 testBean 尚未初始化错误

我有以下课程(部分代码):

@Component
class TestClass: InitializingBean,disposableBean {

    @Autowired
    private lateinit var testBean: SomeObject

    override fun afterPropertiesSet(){
        log.info("testBean 1: $testBdean")
    }

    fun testFunction(testName: String): Boolean {
       log.info("testBean 2: $testBdean")
    }

    @Throws(Exception::class)
    override fun destroy() {
        
    }
}

我看到 testBean 1 已成功运行,但 testBean 2 出现错误:lateinit 属性 testBean 尚未初始化。那么 testBean bean 是在 afterPropertiesSet() 中初始化的,并且在其他函数中不可用?我知道如果我们将 testBean 放在构造函数 TestClass(testBean) 中,它将被初始化并可供所有函数使用。但是还有另一种方法,因为 TestClass 会从其他包中调用,并不是每个包都可以将 testBean 传递给构造函数

解决方法

您可以创建一个 object 来保存您的 TestClass 并使用该持有者来引用您的创建组件

类似:

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

@Component
class SomeObject(val name:String = "some object")

@Component
class TestClass(val someObject: SomeObject) {
    init {
        TestClassHolder.testClass = this
    }
    fun test() = someObject.name

}

object TestClassHolder {
    lateinit var testClass: TestClass
}

class NotBeanClass {
    fun call() = TestClassHolder.testClass.test()
}


@RestController
class TestController {

    @GetMapping
    fun test() = NotBeanClass().call()

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。