Webflux环境下Spring Boot GraphQL拦截器配置及上下文值无法获取问题
解决Webflux环境下Spring GraphQL拦截器上下文无法获取的问题
问题分析
你当前的拦截器代码存在两个核心问题:
- 直接替换GraphQL上下文而非合并原有内容,可能覆盖框架默认注入的上下文数据
- 拦截器未正确注册到Spring GraphQL的执行链中
修复步骤
1. 修正拦截器代码
修改拦截器逻辑,合并原有上下文而非直接替换,确保框架默认的上下文数据不丢失:
class RequestHeaderInterceptor : WebGraphQlInterceptor { private val ccc = "zzz" override fun intercept(request: WebGraphQlRequest, chain: WebGraphQlInterceptor.Chain): Mono<WebGraphQlResponse> { val value = request.headers.getFirst(ccc) request.configureExecutionInput { executionInput, builder -> // 合并原有上下文,避免覆盖默认内容 val existingContext = executionInput.graphQLContext ?: emptyMap() val newContext = existingContext + mapOf("token" to value) builder.graphQLContext(newContext).build() } return chain.next(request) } }
2. 注册拦截器到Spring容器
创建配置类,将拦截器注册为Bean并添加到GraphQL执行链:
@Configuration class GraphQlConfig { @Bean fun requestHeaderInterceptor() = RequestHeaderInterceptor() @Bean fun graphQlSourceBuilderCustomizer(interceptor: RequestHeaderInterceptor): GraphQlSourceBuilderCustomizer { return GraphQlSourceBuilderCustomizer { builder -> builder.interceptor(interceptor) } } }
3. 正确在控制器中获取上下文
在查询方法中通过DataFetchingEnvironment获取上下文值:
@Controller class DemoController { @QueryMapping fun getDemo(env: DataFetchingEnvironment): String { val token = env.graphQlContext.get<String>("token") return "Received token: ${token ?: "null"}" } }
关键注意点
- 不要直接覆盖GraphQL上下文,必须合并原有数据,否则会丢失框架自动注入的请求相关上下文
- 确保拦截器通过
GraphQlSourceBuilderCustomizer添加到执行链,而非普通的Web拦截器 - 在Webflux环境下,GraphQL上下文仅通过
DataFetchingEnvironment暴露,不要尝试通过ThreadLocal获取
内容的提问来源于stack exchange,提问作者Mejmo
相关产品推荐
相关产品推荐

