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

如何在Spring RestController中将用户名传入GraphQL上下文供数据获取器使用

把请求头用户名传入GraphQL查询的解决方案

要把请求头里的userName传递给GraphQL的数据获取器,核心思路是在执行GraphQL查询时将用户名放入执行上下文(Context),然后在数据获取器中从上下文取出使用。下面结合你的现有代码给出具体实现步骤:

步骤1:修改Controller,将用户名注入GraphQL执行上下文

你当前的代码直接调用graphQL.execute(query),但这个重载方法不会传递自定义上下文。我们需要改用ExecutionInput构建查询请求,把用户名存入上下文:

@RequestMapping(value="/test", method = RequestMethod.POST)
public ResponseEntity testService(@RequestHeader("user") String userName, @RequestBody String query) {
    // 构建带上下文的执行输入,用Map存储方便后续扩展其他参数
    ExecutionInput executionInput = ExecutionInput.newExecutionInput()
        .query(query)
        .context(Map.of("userName", userName))
        .build();
    
    ExecutionResult result = graphQL.execute(executionInput);
    // 处理结果并返回(示例返回标准化的GraphQL响应)
    return ResponseEntity.ok(result.toSpecification());
}

如果你的场景只需要传递用户名这一个参数,也可以直接把userName作为上下文对象(省略Map):

.context(userName)

步骤2:在数据获取器中读取上下文里的用户名

不管你是通过代码注册DataFetcher,还是用Schema注解绑定,都可以通过DataFetchingEnvironment获取上下文:

示例1:代码注册DataFetcher的场景

DataFetcher<UserModifi> updateUserModifiFetcher = environment -> {
    // 从Map上下文取出用户名
    String userName = (String) environment.getGraphQlContext().get("userName");
    // 如果直接传的是String上下文,就这么取:
    // String userName = (String) environment.getGraphQlContext();
    
    // 用用户名执行你的更新逻辑
    UserModifi updated = userModifiRepository.updateLastModifiedBy(userName);
    return updated;
};

// 将DataFetcher注册到Schema的对应字段
RuntimeWiring wiring = RuntimeWiring.newRuntimeWiring()
    .type("Mutation", typeWiring -> typeWiring
        .dataFetcher("updateUserModifi", updateUserModifiFetcher))
    .build();

示例2:Spring GraphQL注解绑定的场景(Spring Boot整合)

如果你用@SchemaMapping或@DataFetcher注解,可直接注入DataFetchingEnvironment获取上下文:

@SchemaMapping(typeName = "Mutation", field = "updateUserModifi")
public UserModifi updateUserModifi(DataFetchingEnvironment env) {
    String userName = (String) env.getGraphQlContext().get("userName");
    return userModifiService.updateByUser(userName);
}

为什么推荐用GraphQL上下文而非RequestContextHolder?

虽然你也可以把用户名放到RequestContextHolder的请求属性中,让DataFetcher通过Spring上下文获取,但GraphQL原生上下文更符合其设计规范——它是GraphQL执行流程的标准传递通道,不管你的执行环境是Web还是非Web(比如批量任务),都能正常工作,耦合性更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:07:09