问题描述
来自 graphql 模式的书籍模型
type Book {
id: ID
name: String
pageCount: Int
author: Author
}
所以我有这个用于 Book 的解析器
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);
};
}
这很有效,但我对解析器方式感兴趣。可能吗?
解决方法
您可以添加 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);
}
需要明确的是,对于您创建的解析器并给出查询请求,响应将只有名称而没有其他字段。