Scala升级至2.13.8后Akka HTTP无法处理Json数组报错问题
问题原因
这个隐式查找报错是Scala 2.13集合重构、spray-json 1.3.6隐式优先级调整共同引发的隐式歧义问题,和Akka HTTP本身的逻辑改动无关:
- Scala 2.13重写了标准库集合层级,拆分了可变/不可变集合的父类定义,移除了旧版本的
GenTraversable等通用集合父类,泛型隐式的匹配规则和2.12版本存在差异 - spray-json 1.3.6调整了内置集合类JsonFormat的生成优先级,新增了针对
Iterable[T]的低优先级默认Format,和akka-http-spray-json 10.2.7自带的集合反序列化推导逻辑产生优先级冲突 - 冲突发生时,编译器无法确定该选择哪一个可用的隐式实例,就会抛出“找不到隐式参数值”的报错,所有集合类型(List/Seq/Array)的反序列化都会触发这个问题,单实体反序列化不受影响。
Scala 2.12环境下不存在这个问题:旧版本集合层级下两个隐式的优先级有明确高低差,不会出现歧义。
修复方案
任选以下一种方案即可解决问题:
- 方案1:在路由定义的文件顶部显式导入spray-json默认协议,把高优先级的集合JsonFormat带入隐式作用域,直接消除歧义:
import spray.json.DefaultJsonProtocol._ - 方案2:手动定义集合类型的反序列化器,明确指定隐式实例,避免编译器做模糊匹配:
// 以List为例,Seq/Array可同理定义 implicit def listReqUnmarshaller[T: RootJsonReader]: FromRequestUnmarshaller[List[T]] = sprayJsonUnmarshallerConverter(implicitly[RootJsonReader[List[T]]]) - 方案3:不调整代码的前提下,把spray-json版本回退到1.3.5,该版本没有调整集合Format的优先级,和Scala 2.13.8、akka-http 10.2.7兼容无冲突
- 方案4:把akka-http版本升级到10.2.10及以上,高版本已经适配Scala 2.13集合层级和spray-json 1.3.6的隐式规则,从框架层面修复了这个推导冲突问题。
内容的提问来源于stack exchange,提问作者Hustwhw
相关产品推荐
相关产品推荐

