Kotlin Spring调用Service方法报Unresolved reference错误如何解决
问题原因
- 你当前定义的
load是MyService的实例方法,必须通过MyService的实例对象才能调用,你直接使用类名MyService.load(myKey)属于调用类级别方法的写法,自然会报找不到引用的错误。 @Service是Spring框架的注解,作用是将该类的实例托管到Spring容器中,不会将类中的普通方法转换为类级别方法。- IDE出现「有方法提示但实际标红报错」的情况,一般是IDE索引缓存不一致导致的:可能存在同名类的旧索引、或者你之前定义过同名类级别方法后删除,索引未同步更新。
解决方法
根据你的使用场景选择对应方案即可:
方案1(Spring项目最推荐):通过依赖注入获取实例调用
在需要调用load方法的类中,将MyService注入后使用实例调用,符合Spring开发规范,也能正常使用MyService中注入的myLoader依赖:
// 举个文件B中的代码示例 @Service class YourBizService( // 构造函数注入MyService实例 private val myService: MyService ) { fun yourBizMethod(myKey: SomeKey) { // 用注入的实例调用方法,不是直接用类名 myService.load(myKey) } }
方案2:将方法调整为类级别方法
如果你确实不需要实例就能调用load方法,可以将方法放到MyService的伴生对象中,注意伴生对象内的方法无法直接访问类的实例成员(比如你注入的myLoader,如果方法需要用到myLoader则不能用这个方案):
@Service class MyService( private val myLoader: Loader ) { // 伴生对象内的方法属于类级别,可以直接通过类名调用 companion object { fun load(myKey: SomeKey) = /* 此处逻辑不能用到myLoader等实例成员 */ } }
方案3(索引异常时使用):清理IDE缓存
如果你确认代码写法无误还是出现标红报错,清理IntelliJ缓存重启即可:
- 顶部菜单栏选择
File -> Invalidate Caches... - 弹窗中勾选清理选项后点击
Invalidate and Restart,等待IDE重启重新构建索引即可
内容的提问来源于stack exchange,提问作者inconnu
相关产品推荐
相关产品推荐

