从 graphql 获取解析器级别的请求字段

dou*_*leW 9 graphql graphql-java graphql-java-tools

来自 graphql 模式的书籍模型

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

Run Code Online (Sandbox Code Playgroud)

所以我有一个 Book 解析器

type Book {
  id: ID
  name: String
  pageCount: Int
  author: Author
}

Run Code Online (Sandbox Code Playgroud)

效果很好。

现在假设我正在使用这个 graphql 查询,它只请求 Book 的一个字段

{
  bookById(id: "someId") {
    name
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如何获取有关请求字段的 bookById 方法级别的信息(在本例中仅是名称字段)?这对于 GraphQLQueryResolver 概念来说是可能的吗?

dataFetcher 的示例

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但我对解析器方式感兴趣。是否可以?

小智 13

您可以添加 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);
}
Run Code Online (Sandbox Code Playgroud)

需要明确的是,对于您创建的解析器并给出查询请求,响应将只有名称而没有其他字段。