升级SpringBoot3.1.2后MVC集成GraphQL报No ContextAccessor异常求助
将基于Maven构建、集成spring-boot-starter-web与spring-boot-starter-graphql的MVC项目升级至Spring Boot 3.1.2版本后,通过GraphiQL或Postman调用GraphQL接口时抛出以下异常:
java.lang.IllegalStateException: No ContextAccessor for contextType: class reactor.util.context.Context0 at io.micrometer.context.ContextRegistry.getContextAccessorForWrite(ContextRegistry.java:220) at io.micrometer.context.DefaultContextSnapshot.updateContextInternal(DefaultContextSnapshot.java:63) at io.micrometer.context.DefaultContextSnapshot.updateContext(DefaultContextSnapshot.java:43) at reactor.core.publisher.MonoContextWrite.subscribeOrReturn(MonoContextWrite.java:38) at reactor.core.publisher.Mono.subscribe(Mono.java:4475) at reactor.core.publisher.Mono.subscribeWith(Mono.java:4605) at reactor.core.publisher.Mono.toFuture(Mono.java:5010) at org.springframework.core.ReactiveAdapterRegistry$ReactorRegistrar.lambda$registerAdapters$5(ReactiveAdapterRegistry.java:244) at org.springframework.core.ReactiveAdapter.fromPublisher(ReactiveAdapter.java:121) at org.springframework.web.servlet.function.DefaultAsyncServerResponse.create(DefaultAsyncServerResponse.java:186) at org.springframework.web.servlet.function.ServerResponse.async(ServerResponse.java:250) at org.springframework.graphql.server.webmvc.GraphQlHttpHandler.handleRequest(GraphQlHttpHandler.java:111) at org.springframework.web.servlet.function.support.HandlerFunctionAdapter.handle(HandlerFunctionAdapter.java:107) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
这个异常核心是Micrometer Context无法找到适配Reactor Context的ContextAccessor,针对Spring Boot 3.1.2的MVC+GraphQL场景,可按以下步骤排查解决:
检查依赖版本一致性:确保项目未手动指定冲突的
micrometer-context或Reactor相关版本,直接依赖Spring Boot的依赖管理即可。若之前手动添加过相关依赖版本,删除自定义配置,让Spring Boot自动协调版本。补充Reactor Context适配依赖:手动引入
micrometer-reactor-context依赖,该依赖提供了Reactor Context对应的ContextAccessor,解决适配缺失问题。在pom.xml中添加:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-reactor-context</artifactId> </dependency>
排查GraphQL上下文配置:项目是MVC环境(非WebFlux),需确保GraphQL的DataFetcher等组件未错误依赖Reactor Context的传递逻辑,尽量保持MVC的同步/异步模型,避免不必要的Reactor上下文操作。
手动注册ContextAccessor:若项目有自定义的Micrometer Context配置导致默认Accessor未注册,可手动注册
ReactorContextAccessor:
import io.micrometer.context.ContextRegistry; import io.micrometer.reactor.context.ReactorContextAccessor; import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component; @Component public class ContextConfig { @PostConstruct public void registerReactorContextAccessor() { ContextRegistry.getInstance().registerAccessor(new ReactorContextAccessor()); } }
- 清理冲突依赖:执行
mvn dependency:tree查看依赖树,排查是否存在Spring Boot 2.x遗留的Reactor、Micrometer相关依赖,通过<exclusions>标签排除冲突的旧版本。
内容的提问来源于stack exchange,提问作者user2824203

