使用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
- Maven:
- 通过
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. 验证步骤
- 调整依赖版本后,清理项目构建缓存(Maven:
mvn clean,Gradle:./gradlew clean) - 重新构建并启动项目,测试Schema查询功能
- 若问题仍存在,创建最小可复现项目(仅包含graphql-spqr和必要Spring Boot依赖)验证是否是其他依赖干扰
内容的提问来源于stack exchange,提问作者Venkatesh Madhipatla
相关产品推荐
相关产品推荐

