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

标签 graphql graphql-java graphql-java-tools

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

最佳答案

您可以将 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 - 从 graphql 获取解析器级别的请求字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65935113/

相关文章:

graphql - 是否可以在 GraphQL 中实现多个接口(interface)?

java - 使用模式对 GraphQL 响应进行类型保留反序列化

java - graphql-java 与 graphql-java-tools 的使用区别

graphql - Relay.js 中的查看器

node.js - 如何在 graphql-compose 中扩展模式

graphql - 使用graphql-java-tools检索请求的GraphQL字段,而无需等待父级解析

java - graphql-java-tools:空参数与不存在参数

java - 使用 graphql-java-tools 和 graphql-spring-boot-starter 进行错误处理

java - 过滤嵌套字段,或将类型映射到查询

spring-boot - GraphQL 测试返回 404 未找到