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

使用graphql-spqr-spring-boot-starter查询Schema遇NoSuchMethodError求助

GraphQL-SPQR Spring Boot Starter 运行异常排查问题

问题描述

使用graphql-spqr-spring-boot-starter查询Schema时突然抛出异常,此前功能正常。上次成功运行后仅通过Homebrew安装了Rosetta2,怀疑是否因此引发问题。已回滚所有代码变更,添加了简单的查询和Mutation示例,但错误仍持续出现,无法正常查询Schema。

异常堆栈信息

java.lang.NoSuchMethodError: 'graphql.ExecutionInput$Builder graphql.ExecutionInput$Builder.context(java.util.function.UnaryOperator)' 
at io.leangen.graphql.util.ContextUtils.lambda$wrapContext$1(ContextUtils.java:13) ~[spqr-0.12.4.jar:na] 
at graphql.ExecutionInput.transform(ExecutionInput.java:164) ~[graphql-java-22.0.jar:na] 
at io.leangen.graphql.util.ContextUtils.wrapContext(ContextUtils.java:13) ~[spqr-0.12.4.jar:na] 
at io.leangen.graphql.GraphQLRuntime$InputTransformer.instrumentExecutionInput(GraphQLRuntime.java:126) ~[spqr-0.12.4.jar:na] 
at graphql.GraphQL.lambda$executeAsync$9(GraphQL.java:421) ~[graphql-java-22.0.jar:na] 
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[na:na] 
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341) ~[na:na] 
at graphql.GraphQL.executeAsync(GraphQL.java:418) ~[graphql-java-22.0.jar:na] 
at io.leangen.graphql.spqr.spring.web.HttpExecutor.lambda$execute$0(HttpExecutor.java:33) ~[graphql-spqr-spring-boot-autoconfigure-1.0.1.jar:na] 
at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:47) ~[reactor-core-3.6.6.jar:3.6.6] 
at reactor.core.publisher.Mono.subscribe(Mono.java:4568) ~[reactor-core-3.6.6.jar:3.6.6] 
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler$DeferredResultSubscriber.connect(ReactiveTypeHandler.java:466) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler.handleValue(ReactiveTypeHandler.java:163) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler.handleReturnValue(ResponseBodyEmitterReturnValueHandler.java:154) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.24.jar:6.0] 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.24.jar:6.0] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.8-SNAPSHOT.jar:6.1.8-SNAPSHOT] 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24] 
at java.base/java.lang.Thread.run(Thread.java:1570) ~[na:na]

核心疑问

  • 安装Rosetta2是否会引发该异常?
  • 如何添加追踪机制排查问题根源?

问题分析与解决方案

1. Rosetta2与异常的关联

Rosetta2是Apple Silicon Mac上运行x86_64应用的兼容层,仅影响二进制执行环境,不会直接修改Java依赖或代码逻辑。你遇到的NoSuchMethodError属于Java依赖版本冲突问题,和Rosetta2安装无关,可以排除这个因素。

2. 异常根源:依赖版本不兼容

从堆栈信息看,graphql-spqr(版本0.12.4)尝试调用graphql.ExecutionInput$Builder.context(UnaryOperator)方法,但当前使用的graphql-java(版本22.0)中不存在这个方法:

  • graphql-java在v19版本后重构了ExecutionInput.Builder的context方法签名,旧版本接受UnaryOperator的重载被移除或修改
  • graphql-spqr 0.12.4依赖的是较低版本的graphql-java(比如v18及以下),和你当前项目中的v22.0存在API不兼容

3. 修复方案

方案一:统一依赖版本

  • 降低graphql-java版本到graphql-spqr 0.12.4兼容的范围(比如v18.x),或者升级graphql-spqr到支持graphql-java v22的版本
  • 执行依赖树命令查看冲突来源:
    • Maven:mvn dependency:tree -Dverbose -Dincludes=com.graphql-java:graphql-java
    • Gradle:./gradlew dependencyInsight --dependency com.graphql-java:graphql-java
  • 通过dependencyManagement(Maven)或resolutionStrategy(Gradle)锁定兼容的graphql-java版本

方案二:添加追踪机制排查问题

追踪依赖冲突

  • Maven:用mvn dependency:tree输出完整依赖树,筛选出所有引入graphql-java的路径,找出间接引入高版本的依赖
  • Gradle:执行./gradlew dependencies查看依赖树,定位冲突节点

运行时类加载追踪

  • 添加JVM启动参数-verbose:class,启动项目时会打印所有加载的类及其来源Jar包,确认graphql.ExecutionInput类是否来自预期版本的Jar:
java -verbose:class -jar your-app.jar

代码调试

  • 在ContextUtils.java的wrapContext方法处打断点,查看调用栈中ExecutionInput.Builder的实际类型,确认类加载来源是否异常

4. 验证步骤

  1. 调整依赖版本后,清理项目构建缓存(Maven:mvn clean,Gradle:./gradlew clean)
  2. 重新构建并启动项目,测试Schema查询功能
  3. 若问题仍存在,创建最小可复现项目(仅包含graphql-spqr和必要Spring Boot依赖)验证是否是其他依赖干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:35:53