带有 Spring 的 GraphQL-java - 解析器 vd datafetcher

Posted

技术标签:

【中文标题】带有 Spring 的 GraphQL-java - 解析器 vd datafetcher【英文标题】:GraphQL-java with Spring - resolvers vd datafetcher 【发布时间】:2020-07-20 15:13:57 【问题描述】:

GraphQL 和 Java (Spring) 一团糟。有多个项目,多个示例,但完全不一致。

我理解 Spring Boot 应该提供的是 OOTB 工作解决方案,并且(在某种程度上)它是这样工作的。为您提供此类体验的项目位于 Github https://github.com/graphql-java-kickstart。尤其是https://github.com/graphql-java-kickstart/graphql-spring-boot 让您可以创建架构、制作解析器,其他一切都自动完成。

问题是当您尝试将解析器(看起来非常简单的数据提取器)替换为自定义数据提取器时。据我所知,不可能制作异步解析器或批量解析器 - 您必须制作数据提取器。

要制作自定义数据获取器,需要进行自定义接线等,替换 spring-boot 解决方案,或者以某种方式使用它(如何?)。没有一点是正确的,如何正确地做到这一点。我什至发现 BatchedDataFetcher 在获得良好的 Spring Boot 支持/示例之前已被弃用(!)(请参阅:GraphQL Java: Using @Batched DataFetcher)

因此,我什至不知道在哪里寻找解决方案。我希望看到的是有一个例子:

Spring Boot 支持 异步/并行数据获取器 批量数据提取器 使用 GraphQL 端点连接多个服务(可能超出范围) 分页/过滤

【问题讨论】:

【参考方案1】:

无论如何,答案是:使用 graphql-java-kickstart 项目,因为那些 来自https://www.graphql-java.com/ 已过时。这个事实很 具有误导性,应该在某处说明。

不是真的。 graphql-java 只是我目前知道的 GraphQL java 实现。它定义了DataFetcher。它是核心库,而您发现的其他项目,例如 java-kickstart(或者更准确地说是 graphql-java-tool)是建立在 graphql-java 之上的,它定义了自己的 DataFetcher 实现,称为Resolver

最后,Resolver 只是一个DataFetcher

您可以在此blog post 中找到有关这两个项目的更多相关信息。

因此,如果您想在构建 GraphQL 服务器时获得最大的灵活性,请使用graphql-java。另一方面,如果您喜欢 graphql-java-tool 使用的固执己见的方式,请使用它。

【讨论】:

Tools 项目也有一些相当古老的 Spring 示例。当我使用 Spring 时,很难理解为什么 Kickstarter 库不使用它。 graphql-java 在他们的网页上推广旧示例,并且不告诉任何关于 Kickstarter 项目的事实,这一事实很难理解。【参考方案2】:

我的问题是由 2 个适用于 graphql-java 的不同框架引起的。几天后,我知道数据获取器的日子已经一去不复返了(在https://www.graphql-java.com/tutorials/getting-started-with-spring-boot/ 上推广)。

现在,如果你想简单一点,你可以制作解析器,你就完成了:https://github.com/graphql-java-kickstart 如果你想更深入,你应该做数据加载器:https://github.com/graphql-java/java-dataloader

无论如何,答案是:使用 graphql-java-kickstart 项目,因为来自 https://www.graphql-java.com/ 的项目已经过时。这个事实非常具有误导性,应该在某处说明。

【讨论】:

这是很好的信息,但你有没有找到很好的例子?我也对 Java GraphQL 生态系统中当前批处理请求、n+1 等的“最佳实践”有些迷茫。

以上是关于带有 Spring 的 GraphQL-java - 解析器 vd datafetcher的主要内容,如果未能解决你的问题,请参考以下文章

在 spring boot 中使用 graphql-java 我无法在嵌套列表中查询数据

突变查询 graphql-java

带有 Kafka(和 Spring Boot)的分布式系统中的 Graphql 订阅

解析类型时不存在 BigDecimal

graphql-java 中的 GraphQL 模式定义语言支持

Maven 和 graphql-java