【问题标题】:Kotlin Spring: Unresolved reference methodKotlin Spring:未解决的参考方法
【发布时间】:2021-10-22 19:43:09
【问题描述】:

我在文件 A 中有以下类:

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

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

我想像这样在另一个文件 B 中调用该函数:

MyService.load(myKey)

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

我该如何解决这个问题?

【问题讨论】:

  • 您需要一个类的实例才能访问该类的函数。在春天(你可能应该标记,或者至少在问题中提到)你可以通过在你需要使用它的地方自动装配它来做到这一点。将函数设为静态(将其移动到伴随对象)将无济于事,因为您需要访问 myLoader 这是类本身的属性。

标签: spring kotlin


【解决方案1】:

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

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

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

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


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

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,绝对不是一个干净的解决方案。考虑一下我最初的建议。

【讨论】:

  • 使用对象有什么理由吗?这会创建一个单例对象。
  • 我已经编辑了我的问题。
  • @inconnu,这有什么帮助吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2021-10-29
  • 2018-10-16
  • 2023-03-25
相关资源
最近更新 更多