2

来自 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 方式很感兴趣。可能吗?

4

1 回答 1

3

您可以将 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);
}

为了清楚起见,对于您创建并给出查询请求的解析器​​,响应将只有名称而没有其他字段。

于 2021-01-28T13:57:44.483 回答