IntelliJ从Kotlin对象找不到Spring bean

时间:2019-04-27 22:58:58

标签: spring intellij-idea kotlin

我有一个使用IntelliJ 2019.1。打开的Spring Boot 2 + Kotlin应用程序。

在此应用程序中,我用@Component注释了一些Kotlin对象。示例:

@Component
object MyObject: MyInterface {
    // code
}

我有MyInterface的许多不同实现(全部带有Kotlin对象),我想将所有这些注入到另一个bean的列表中。示例:

@Component
class MyComponent @Autowired constructor(private val objects: List<MyInterface>) {
    // code
}

代码运行正常(bean被注入列表objects中),但是IntelliJ显示错误,提示:

  

无法自动接线。没有豆子吗?扩展MyInterface”或“ List <?扩展发现的MyInterface>类型。

如果我将“ MyObject”中的“ object”更改为“ class”,则错误消失。

我的问题是:

  • IntelliJ是否有问题?
  • 是否不建议使用@Component注释Kotlin对象?

3 个答案:

答案 0 :(得分:1)

将Kotlin对象用作@Component-s有点奇怪,因为如果您的类知道它将在Spring容器内使用,那么如果将委托委托给Spring,您将获得更大的灵活性。此类是否为单例以及其他所有生命周期管理。

但是,实际上,我不知道如果您知道自己在做什么,并且如果object变成有状态的话,可能不建议“不推荐”的任何原因。

所以我认为IDEA应该支持您的情况,并且我已经填好了票证IDEA-211826

答案 1 :(得分:1)

有关信息,作为一种可能的解决方法,尽管未处理Николай在ticket中创建的this answer,但我忽略了错误/仅在需要@Suppress("SpringJavaInjectionPointsAutowiringInspection")时发出警告。示例:

@Suppress("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private lateinit var kotlinObjectBeans: List<MyInterface>

我希望它可以帮助不想在其他地方禁用此检查的其他人。

答案 2 :(得分:0)

我建议不要将 kotlin对象与@Component或任何其他bean注释一起使用。

有两个方面,将它们混合在一起会导致很多问题:

  1. 您的应用程序中可能有多个ApplicationContext实例。
  2. 科特林对象与特定的ClassLoader
  3. 相关