Spring Boot混编Kotlin遇java.lang.NoSuchMethodError问题求助
Spring Boot混合Kotlin项目运行时NoSuchMethodError异常分析与解决
问题描述
我有一个Java Spring Boot项目,混合使用Kotlin开发,执行Apollo GraphQL mutation操作时触发运行时异常,不清楚异常原因及解决办法。
异常栈信息
Caused by: java.lang.NoSuchMethodError: 'void kotlin.jvm.internal.FunctionReferenceImpl.<init>(int, java.lang.Class, java.lang.String, java.lang.String, int)' at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.<init>(SafeCollector.kt) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.<clinit>(SafeCollector.kt) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at kotlinx.coroutines.flow.internal.SafeCollectorKt.<clinit>(SafeCollector.kt:15) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:87) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:66) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at com.apollographql.apollo3.network.http.HttpNetworkTransport$execute$1.invokeSuspend(HttpNetworkTransport.kt:83) ~[apollo-runtime-jvm-3.7.4.jar:3.7.4] at com.apollographql.apollo3.network.http.HttpNetworkTransport$execute$1.invoke(HttpNetworkTransport.kt) ~[apollo-runtime-jvm-3.7.4.jar:3.7.4] at com.apollographql.apollo3.network.http.HttpNetworkTransport$execute$1.invoke(HttpNetworkTransport.kt) ~[apollo-runtime-jvm-3.7.4.jar:3.7.4] at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:61) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na] at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:230) ~[kotlinx-coroutines-core-jvm-1.6.4.jar:na]
触发异常的代码
val response = runBlocking { apolloClient.mutation( UpdateCuratedCollectionMutation( input = curatedCollectionInput, version = collection.updatedAt.toEpochSecond() ) ).execute() }
项目依赖配置(Gradle)
springBootVersion = '2.7.4' id "org.jetbrains.kotlin.jvm" version "1.8.10" id "com.apollographql.apollo3" version "3.7.4" id 'org.jetbrains.kotlin.plugin.lombok' version '1.8.10' id 'io.freefair.lombok' version '5.3.0' implementation 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10' implementation "com.apollographql.apollo3:apollo-runtime:3.7.4"
原因分析
这个NoSuchMethodError本质是Kotlin版本与协程库版本不兼容:
- 项目使用Kotlin 1.8.10,但间接依赖的
kotlinx-coroutines-core版本为1.6.4,该版本的协程库是基于旧版Kotlin编译的。 - Kotlin内部的
FunctionReferenceImpl构造方法签名在版本迭代中发生了变更,旧版协程库调用了新版Kotlin中已不存在的构造方法,导致运行时找不到方法。
解决方案
1. 升级kotlinx-coroutines-core版本
将协程库升级到与Kotlin 1.8.10兼容的版本,推荐使用1.7.3(该版本完美适配Kotlin 1.8.x)。在Gradle中添加或更新依赖:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-spring:1.7.3" // 若需Spring整合支持则添加
2. 统一所有Kotlin相关依赖版本
确保项目中所有Kotlin插件、核心依赖版本一致,避免间接依赖引入冲突:
- 执行Gradle命令排查Kotlin依赖冲突:
./gradlew dependencyInsight --dependency org.jetbrains.kotlin:kotlin-stdlib-jdk8
- 若发现旧版Kotlin依赖,在
build.gradle中强制统一版本:
configurations.all { resolutionStrategy { force "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.10" force "org.jetbrains.kotlin:kotlin-reflect:1.8.10" } }
3. 验证Apollo GraphQL版本兼容性
确认Apollo 3.7.4是否兼容Kotlin 1.8.10,若存在兼容性问题,可升级Apollo版本到支持Kotlin 1.8.x的最新稳定版,或调整Kotlin版本至Apollo官方支持的范围。
内容的提问来源于stack exchange,提问作者SomeGuyWhoCodes
相关产品推荐
相关产品推荐

