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

Scala 3中使用Sangria遇NoSuchMethodError问题求助

Scala 3下使用Sangria出现NoSuchMethodError的解决线索

问题根源

你遇到的NoSuchMethodError本质是Scala 2与Scala 3的二进制兼容性问题:依赖的Sangria相关库通过CrossVersion.for3Use2_13强制使用Scala 2编译版本,而Scala 3对默认参数的方法签名处理与Scala 2不同,导致调用Executor.execute时找不到对应默认参数的方法实现。

解决步骤

  • 升级到Scala 3原生支持的Sangria版本
    当前使用的sangria-akka-http-circe:0.0.4版本过旧,未适配Scala 3。Sangria核心库从2.0.0开始正式支持Scala 3,对应的sangria-akka-http-circe适配版本为1.0.0+。同时Akka 2.6.x已原生支持Scala 3,无需再使用cross(CrossVersion.for3Use2_13)。

    修改后的build.sbt示例:

    val AkkaVersion = "2.6.21"
    val SangriaVersion = "2.1.0"
    val SangriaAkkaHttpVersion = "1.0.1"
    
    crossScalaVersions := Seq("2.13.12", "3.3.0")
    ThisBuild / scalaVersion := "3.3.0"
    
    libraryDependencies ++= Seq(
      "com.typesafe.akka" %% "akka-actor-typed" % AkkaVersion,
      "com.typesafe.akka" %% "akka-stream-typed" % AkkaVersion,
      "org.sangria-graphql" %% "sangria" % SangriaVersion,
      "org.sangria-graphql" %% "sangria-akka-http-circe" % SangriaAkkaHttpVersion,
      "org.sangria-graphql" %% "sangria-circe" % SangriaVersion
    )
    
  • 显式传递所有参数避免默认参数依赖
    如果暂时无法升级版本,需显式指定Executor.execute的所有参数,不要依赖Scala的默认参数推导。例如将原本省略部分参数的调用,改为完整传递所有参数(具体参数需匹配你使用的Sangria版本的方法签名):

    Executor.execute(
      schema = yourSchema,
      queryAst = yourQuery,
      userContext = yourContext,
      operationName = None,
      variables = Map.empty,
      root = (),
      middleware = Nil
    )
    
  • 检查依赖一致性
    执行sbt dependencyTree查看依赖树,确保所有Sangria相关库版本统一,且没有混入Scala 2编译的旧版本依赖。若存在冲突,使用exclude规则移除不兼容的依赖项。

Scala 3使用Sangria的示例说明

目前Sangria官方已适配Scala 3,核心写法与Scala 2差异不大,主要是依赖配置需使用Scala 3原生支持的版本,同时注意Scala 3的语法细节(比如枚举、隐式参数的写法)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:04:50