You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ktor Server添加路由级超时后触发无限递归问题求助

解决Ktor路由级超时引发的Jackson无限递归错误

错误原因分析

从异常栈来看,这是Jackson序列化协程对象时触发的循环引用问题:StandaloneCoroutine(超时协程)和UndispatchedCoroutine(子协程)之间通过children和parent$kotlinx_coroutines_core字段互相引用,导致序列化时无限递归直至栈溢出。超时机制只是触发场景,本质是错误地将协程实例(或持有协程引用的对象)作为响应体返回给客户端了。

具体解决方案

  • 排查响应体内容:检查路由处理逻辑,确保call.respond()传入的是纯业务数据对象,而非协程Job实例、Deferred对象或包含这些协程相关对象的结构。比如不要把withTimeout的协程上下文、返回的Job直接传给respond。
  • 提取协程状态而非序列化协程:如果需要返回协程执行状态,手动提取所需字段(比如执行结果、是否超时),封装成普通数据类返回,不要直接序列化协程对象。
  • 临时规避Jackson循环引用(不推荐):如果暂时无法修改响应体结构,可以通过Jackson配置忽略循环引用,但这是治标不治本的方案:
val jacksonMapper = jackson {
    disable(SerializationFeature.FAIL_ON_SELF_REFERENCES)
    // 或者使用@JsonIgnore标注协程对象中的parent/children字段
}
  • 规范路由超时实现:确保路由级超时的正确用法,用withTimeout包裹业务逻辑,仅返回业务结果:
route("/your-api") {
    get {
        val businessResult = withTimeout(3000) {
            // 执行数据库查询、外部调用等业务逻辑
            fetchBusinessData()
        }
        call.respond(businessResult) // 仅返回业务数据
    }
}

总结

这个问题和协程取消逻辑无关,核心是错误序列化循环引用的协程对象。只要确保响应体是无循环引用的纯业务对象,就能解决该错误。

内容的提问来源于stack exchange,提问作者Anupam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:03:40