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

