首页 > 解决方案 > Kotlin Spring:未解决的参考方法

问题描述

我在文件 A 中有以下类:

@Service
class MyService(
  private val myLoader: Loader
) {

  fun load(myKey: SomeKey) =
    myLoader.loadStuff(myKey)
}

我想在另一个文件 B 中调用该函数,如下所示:

MyService.load(myKey)

但是,load() 方法在 IntelliJ 中标记为红色。错误显示“未解决的参考:加载”,我不知道为什么。当我输入MyService.IntelliJ 时,甚至会建议加载方法。

我该如何解决这个问题?

标签: springkotlin

解决方案


由于您使用的是 Spring,因此应该调用的其他组件MyService也必须是 Spring 管理的 Bean,以便它可以获取MyServicebean。文件 B 中的组件应如下所示:

@Service
class MyServiceB (
  private val myService: MyService
) {

  fun test(myKey: SomeKey) = myService.load(myKey)
}

注意@Service使它成为 Spring 管理的 Bean 的注释以及作为构造函数MyService的参数的事实,告诉 Spring必须注入MyServiceB类型的 Bean 。MyService


鉴于您有一个对象而不是一个类,您将不得不执行以下操作:

object MyServiceB (
  lateinit var myService: MyService
) {

  fun test(myKey: SomeKey) = myService.load(myKey)
}
@Configuration
class MyServiceBConfiguration(private val myService: MyService) {

    @Bean
    fun myServiceB(): MyServiceB {
        return MyServiceB.also {
            it.myService = myService
        }
    }
}

这应该可行,但我绝对不推荐它。这是一个 hack,绝对不是一个干净的解决方案。考虑一下我最初的建议。


推荐阅读