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

Webflux环境下Spring Boot GraphQL拦截器配置及上下文值无法获取问题

解决Webflux环境下Spring GraphQL拦截器上下文无法获取的问题

问题分析

你当前的拦截器代码存在两个核心问题:

  1. 直接替换GraphQL上下文而非合并原有内容,可能覆盖框架默认注入的上下文数据
  2. 拦截器未正确注册到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:13:26