如何在GraphQL Java中将查询参数传递给子DataFetcher
解决GraphQL Java中子解析器获取父级参数/别名的问题
针对你遇到的解析顺序导致GraphQLContext存储信息被覆盖的问题,这里提供两种可靠的解决方案:
方法1:将父级参数嵌入User数据对象中
在userByPhone的DataFetcher执行时,把需要传递的phone参数和查询别名直接存入返回的User对象(可自定义DTO类),这样photoId的DataFetcher就能从父对象中直接读取这些信息,完全不受解析顺序影响。
代码示例
- 自定义包含额外信息的UserDTO:
public class UserDTO { private String id; private String photoId; // 新增字段存储父级参数和查询别名 private String phone; private String queryAlias; // 省略getter、setter方法 }
- 实现
userByPhone的DataFetcher:
DataFetcher<UserDTO> userByPhoneDataFetcher = environment -> { // 获取传入的phone参数 String phone = environment.getArgument("phone"); // 获取当前查询字段的别名(如user1、user2) String queryAlias = environment.getField().getAlias(); // 从数据源获取User的id String userId = userDataSource.getUserIdByPhone(phone); UserDTO userDTO = new UserDTO(); userDTO.setId(userId); // 将phone和别名存入DTO userDTO.setPhone(phone); userDTO.setQueryAlias(queryAlias); return userDTO; };
- 实现photoId的DataFetcher:
DataFetcher<String> photoIdDataFetcher = environment -> { // 从父对象中获取提前存入的信息 UserDTO parentUser = environment.getSource(); String phone = parentUser.getPhone(); String queryAlias = parentUser.getQueryAlias(); // 使用phone或别名调用对应数据源获取photoId return photoDataSource.getPhotoIdByPhone(phone); };
方法2:通过ExecutionStepInfo追溯父级字段信息
如果不想修改原有User数据模型,可以利用DataFetcherEnvironment提供的ExecutionStepInfo,向上追溯父级字段的参数和别名。
代码示例
DataFetcher<String> photoIdDataFetcher = environment -> { ExecutionStepInfo currentStep = environment.getExecutionStepInfo(); // 向上追溯到父级的userByPhone字段(根据Schema结构调整层级) ExecutionStepInfo parentStep = currentStep.getParent(); // 获取父级字段的别名 String parentAlias = parentStep.getField().getAlias(); // 获取父级字段的参数 String phone = (String) parentStep.getArguments().get("phone"); // 使用phone或别名获取photoId return photoDataSource.getPhotoIdByPhone(phone); };
方案对比
- 方法1:实现简单,性能更优,信息直接存储在父对象中,无需额外遍历;适合允许修改数据模型的场景。
- 方法2:无需改动实体类,灵活性更高,但需要注意Schema结构变化时调整追溯层级;适合保持数据模型纯净的场景。
内容的提问来源于stack exchange,提问作者Itzhak Eretz Kdosha
相关产品推荐
相关产品推荐

