【发布时间】:2021-11-23 02:56:35
【问题描述】:
过去几个月我一直在本地运行 Ktor 服务器应用程序并部署到 Heroku,没有任何问题。但是,在部署最新版本后,我开始在尝试处理 Heroku 上的请求正文的任何 POST 请求上看到以下错误:
java.lang.NoSuchMethodError: java.nio.ByteBuffer.limit(I)Ljava/nio/ByteBuffer;
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at io.ktor.utils.io.ExceptionUtilsJvmKt$createConstructor$$inlined$safeCtor$3.invoke(ExceptionUtilsJvm.kt:103)
at io.ktor.utils.io.ExceptionUtilsJvmKt$createConstructor$$inlined$safeCtor$3.invoke(ExceptionUtilsJvm.kt:90)
at io.ktor.utils.io.ExceptionUtilsJvmKt.tryCopyException(ExceptionUtilsJvm.kt:66)
at io.ktor.utils.io.ByteBufferChannelKt.rethrowClosed(ByteBufferChannel.kt:2456)
at io.ktor.utils.io.ByteBufferChannelKt.access$rethrowClosed(ByteBufferChannel.kt:1)
at io.ktor.utils.io.ByteBufferChannel.readRemaining$suspendImpl(ByteBufferChannel.kt:2126)
at io.ktor.utils.io.ByteBufferChannel.readRemaining(ByteBufferChannel.kt)
at io.ktor.utils.io.ByteReadChannelKt.readRemaining(ByteReadChannel.kt:217)
at io.ktor.serialization.SerializationConverter.convertForReceive(SerializationConverter.kt:158)
at io.ktor.features.ContentNegotiation$Feature$install$3.invokeSuspend(ContentNegotiation.kt:224)
at io.ktor.features.ContentNegotiation$Feature$install$3.invoke(ContentNegotiation.kt)
at io.ktor.features.ContentNegotiation$Feature$install$3.invoke(ContentNegotiation.kt)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:248)
at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:116)
at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:136)
at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:78)
at io.ktor.request.ApplicationReceiveFunctionsKt.receive(ApplicationReceiveFunctions.kt:116)
at io.ktor.request.ApplicationReceiveFunctionsKt.receiveOrNull(ApplicationReceiveFunctions.kt:135)
考虑到请求正文可能有一些意外,我首先尝试将call.receive<MyObject>()更改为call.receiveOrNull<MyObject>(),但问题仍然存在。
我被告知这可能是 JVM 不匹配问题,所以我检查了Heroku's Java documentation 并得知默认 JVM 是 1.8。然后我使用 Java 1.8 在本地运行我的应用程序,并且能够重新创建相同的行为。
在changing the target JVM on Heroku for my application to version 11 之后,这显然已经解决了问题。虽然我最近确实添加了 Ktor Authentication“功能”,但我看不到任何其他可能导致此问题的更改。我试图在 Ktor 文档中找到所需的最低 JVM 目标是什么,但无法找到它。很高兴它再次工作,但我希望有更多的信心继续前进。
为了确保服务器的正确执行并避免将来出现此类问题,我想问一下 Ktor Server 支持的 JVM 目标是什么(如果可能,请将其添加到Ktor 文档)。
【问题讨论】:
-
这是 Ktor 1.6.5 (youtrack.jetbrains.com/issue/KTOR-3358) 中的一个错误,将在下一个即将发布的版本中修复。作为一种解决方法,请使用 JDK 11 或更高版本。
-
参见this Q&A 以了解类似的不兼容问题。总之,使用较新的JDK为较旧的JDK编译软件时,必须使用
--release选项,仅使用-source和-target是不够的,因为它会导致这样的问题 -
感谢@Holger 的提示!是的,我在搜索有关此问题的信息时发现了类似的结果;然而,这很奇怪,因为我的 Ktor 应用程序以前可以正常工作,没有任何问题。根据@Aleksei Tirman 的说法,这似乎是当前版本的一个错误,所以我现在正在观看。 ??????????