我有一个使用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”,则错误消失。
我的问题是:
@Component
注释Kotlin对象?答案 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注释一起使用。
有两个方面,将它们混合在一起会导致很多问题:
ApplicationContext
实例。ClassLoader