从 graphql 获取解析器级别的请求字段
Posted
技术标签:
【中文标题】从 graphql 获取解析器级别的请求字段【英文标题】:getting requested fields on resolver level from graphql 【发布时间】:2021-05-02 05:31:24 【问题描述】:来自 graphql 模式的书籍模型
type Book
id: ID
name: String
pageCount: Int
author: Author
所以我有这个书的解析器
public class BookResolver implements BookByIdQueryResolver, GraphQLQueryResolver
private final MockRepository mockRepository;
public BookResolver(MockRepository mockRepository)
this.mockRepository = mockRepository;
@Override
public BookTO bookById(String id)
return mockRepository.getBookById(id);
效果很好。
现在假设我正在使用这个 graphql 查询,它只请求 Book 的一个字段
bookById(id: "someId")
name
问题是,如何在 bookById 方法级别获取有关请求字段的信息(在这种情况下只有名称字段)? GraphQLQueryResolver 概念甚至可以实现这一点吗?
dataFetcher 示例
public DataFetcher getBookByIdDataFetcher()
return dataFetchingEnvironment ->
String bookId = dataFetchingEnvironment.getArgument("id");
List<SelectedField> requestedFields = dataFetchingEnvironment.getSelectionSet()
.getFields()
.stream()
.collect(Collectors.toList());
return books
.stream()
.filter(book -> book.get("id").equals(bookId))
.findFirst()
.orElse(null);
;
这很好用,但我对 Resolver 方式很感兴趣。有可能吗?
【问题讨论】:
您能详细解释一下您的要求吗? 添加了更多细节,问题是在解析器中我只获得了我正在寻找这本书的参数信息(在这种情况下为 id)。我想要实现的事情是我希望能够检查查询中请求书中的哪些字段 你检查了吗? ***.com/questions/48004805/… 这是一个 js 解决方案,我正在寻找 java 中的解决方案,并提到了具体的方法 '每个 DataFetcher 都被传递一个 graphql.schema.DataFetchingEnvironment 对象,该对象包含正在获取的字段、已向字段提供的参数以及其他信息,例如字段的父对象、查询根对象或查询上下文对象。' 【参考方案1】:您可以将 dataFetchingEnvironment 添加为参数,并使用该参数获取请求的字段名称列表。
public BookTO bookById(String id, DataFetchingEnvironment dataFetchingEnvironment)
List<SelectedField> requestedFields = dataFetchingEnvironment.getSelectionSet()
.getFields()
.stream()
.collect(Collectors.toList());
// Use this for your use cases
return mockRepository.getBookById(id);
需要明确的是,对于您创建并给出查询请求的解析器,响应将只有名称,没有其他字段。
【讨论】:
哇,没想到这么简单,去看看 对其进行了测试,运行良好,不知道为什么在我正在寻找的任何解析器示例中都没有提到这一点!以上是关于从 graphql 获取解析器级别的请求字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 type-graphql 解析器函数获取 graphql 后端中的选定字段?