Scala 3 + http4s项目Circe JSON编解码deriveDecoder编译报错求助
问题原因
确实是Scala 3的特性变更导致的问题:
Scala 3放弃了Scala 2时代的Shapeless泛型推导机制,改用原生的deriving.Mirror机制实现编译期泛型派生。你当前使用的circe-generic依赖是针对Scala 2设计的,内部依赖Shapeless实现deriveDecoder,无法适配Scala 3的Mirror派生规则,因此编译时无法找到对应类型的Mirror实例。
解决方案
二选一即可:
方案1:使用Scala 3原生deriving语法(推荐)
无需额外修改依赖,直接在你的Joke类型定义上添加deriving声明即可自动生成编解码器,不需要手动编写implicit val推导代码:
import io.circe.{Decoder, Encoder} // 此处Joke必须是case class/sealed trait才能自动派生 case class Joke(content: String, source: String) derives Decoder, Encoder
方案2:替换为Scala 3适配的circe泛型依赖
如果你仍需要使用半自动推导的写法,可以修改依赖配置:
- 移除原有
circe-generic依赖,替换为Scala 3版本的泛型推导依赖:
// 原有circe-core保留,替换circe-generic为circe-generic-scala3 "io.circe" %% "circe-generic-scala3" % CirceVersion
- 保持原有推导代码不变,确认导入的是正确的semiauto包即可:
import io.circe.generic.semiauto._ implicit val jokeDecoder: Decoder[Joke] = deriveDecoder[Joke] implicit val jokeEncoder: Encoder[Joke] = deriveEncoder[Joke]
额外优化建议
- 你的Scala 3.0.0和Circe 0.14.1版本都比较老,存在较多Scala 3适配bug,建议升级到Scala 3.2+ + Circe 0.14.10+的组合,兼容性更好
- 确认
Joke是case class或者sealed trait,只有这两类类型才能被Scala 3自动生成Mirror实例,普通class会触发同样的编译错误
内容的提问来源于stack exchange,提问作者martyn
相关产品推荐
相关产品推荐

