如何在graphql-java的Show解析器中获取子字段userId参数
在graphql-java中从父解析器获取子字段参数
你的GraphQL Schema定义如下:
type Query { shows: [Show] } type Show { id: Int title: String audiences(userId: [Int]): [User] } type User { id: Int name: String }
你希望在Show解析器层获取其子字段audiences的userId参数,在graphql-java中可以通过解析环境的选择集实现,具体操作如下:
实现步骤
在Show对应的DataFetcher中,通过DataFetchingEnvironment获取当前查询的选择集,遍历找到目标子字段后提取参数:
DataFetcher<List<Show>> showDataFetcher = environment -> { // 获取当前Show字段的查询选择集 SelectionSet selectionSet = environment.getSelectionSet(); // 筛选出选择集中的audiences字段 Optional<Field> audiencesField = selectionSet.getFields().stream() .filter(field -> "audiences".equals(field.getName())) .findFirst(); if (audiencesField.isPresent()) { // 提取audiences字段的参数 Map<String, Object> args = audiencesField.get().getArguments(); List<Integer> userIds = (List<Integer>) args.get("userId"); // 在这里使用获取到的userId参数处理业务逻辑 System.out.println("获取到的userId参数:" + userIds); } // 执行Show的正常解析逻辑,返回数据 return fetchShowsFromDataSource(); };
注意要点
- 该方式依赖客户端的查询字段,如果客户端未请求
audiences,则无法获取到参数,必须做判空处理。 - 参数类型转换需与Schema定义匹配,比如这里
userId是[Int]类型,需转换为List<Integer>。 - 若
audiences存在嵌套子字段,可通过getSelectionSet()继续遍历,但仅获取参数的话直接调用getArguments()即可。
内容的提问来源于stack exchange,提问作者Jumple
相关产品推荐
相关产品推荐

