如何在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
相关产品推荐
相关产品推荐

