Spring for GraphQL 1.0 里程碑 6 发布

工程 | Rossen Stoyanchev | 2022 年 3 月 22 日 | ...

我代表所有参与者,很高兴宣布 Spring for GraphQL 1.0 版本的第六个也是最后一个里程碑版本现已可用。我们的下一站是 4 周后的 RC1,随后是 5 月 17 日的 GA 版本。

GraphQL 客户端

GraphQL 客户端是我们很早就确定为目标的东西。目前在问题跟踪器中,它是 336 个问题中的第 10 个,但我们认为测试支持是更高优先级,因此 GraphQL 测试器优先推出,并且从一开始就可用。

测试器确实被证明有价值且受欢迎,但我们知道在 1.0 之前必须充分探索客户端,因为两者密切相关但视角略有不同,并且我们希望确保它们彼此对齐。

第二点是测试器支持服务器端的订阅测试,但不支持通过 WebSocket 进行测试。这一点非常重要,需要探索,因为与 HTTP 中一个 GraphQL 请求对应一个 HTTP 请求不同,在 WebSocket 中,许多 GraphQL 请求共享同一个连接,这是一种根本不同的操作模式。例如,WebSocket 传输在发出请求时需要透明地连接,确保一个单一的共享连接,管理其生命周期,并且作为一个长连接,提供启动和停止的控制。

我很高兴地宣布,里程碑 6 版本包含了一个 GraphQL 客户端。它支持通过 HTTP 进行单响应请求(查询和变更),以及通过 WebSocket 进行订阅以及查询和变更。

一些使用示例

String document = "{" +
        "  project(slug:\"spring-framework\") {" +
        "   name" +
        "   releases {" +
        "     version" +
        "   }"+
        "  }" +
        "}";

Mono<Project> projectMono = graphQlClient.document(document)
        .retrieve("project")
        .toEntity(Project.class);

响应数据被解码为 Project。请求文档也可以存储在文件中,并通过简单的名称(例如 "project")引用,或者您可以通过代码生成的请求创建它,例如来自 Netflix DGSGraphQLQueryRequest

订阅的一些使用示例

Flux<String> projectFlux = client.document("subscription { projects { name } }")
        .retrieveSubscription("projects")
        .toEntity(Project.class);

还有更多内容待发现。请参阅参考文档中新的 客户端章节

GraphQL 测试器

GraphQL 测试器已更新以与新客户端对齐。两者共享 GraphQL 传输的底层契约,因此测试器现在也支持 WebSocket。

部分 API 已经发生了变化,部分是为了与客户端对齐,但也有其他原因,例如使用正确的术语并避免 query 的重载使用等等。请参阅 此问题及相关链接获取更多详情。

一个值得注意的 API 更改是使用了专用类型来表示 GraphQL 错误,该类型还通过以 "." 分隔的字符串(例如 "project.name")暴露错误路径,这使得通过字符串比较检查预期的字段错误变得相当容易。

对于检查给定 JSON 路径上的响应数据的选择也已缩小范围,以便提供更多指导并专注于重要内容。这些包括字段的 hasValue, isNulldoesNotExist,此外还可以选择解码为更高级别的对象以进行进一步断言。

Spring Security

Spring Security 用户会熟悉 @AuthenticationPincipal 注解,现在您可以在数据控制器中 @SchemaMapping 方法的方法参数上使用它。这提供了对 Spring Security 认证中的 Principal 的访问。

参数绑定

到目前为止,您已经能够使用 @Argument 将特定参数绑定到您选择的对象上。现在您可以使用 @Arguments 将完整的参数映射绑定到对象上。

GraphQL 参数可以是具有嵌套对象或嵌套对象列表的复杂输入类型。参数绑定功能支持将其映射到匹配的 Java 对象结构,包括构造函数和属性初始化以及标量值的类型转换。这使得处理可能发生在任何级别的转换和其他初始化错误成为一个挑战。

现在,参数绑定会抛出包含所有累积错误的 BindException。绑定算法现在遇到第一个错误时不会放弃,而是继续累积尽可能多的错误。每个错误都包含一个 field 属性,该属性是一个以 "." 分隔的路径,指向发生错误的参数位置。

API 变更

本次发布包含了大量的 API 变更。在大多数情况下,这些变更应该很容易处理,并且不会很困难。其中大部分是为了引入客户端,以确保客户端和服务器之间的对称性和一致性命名而推动的。

预计这将是最后一次此类主要的变更轮次。RC1 版本在向后兼容性变更方面应该会相当稳定,并且此后的 API 也将保持稳定。

Boot Starter

现在位于 Spring Boot 本身的 Spring for GraphQL Boot starter 已经跟进了所有的变更。最新的 Spring Boot 2.7 快照是最新的,并且 2.7 M3 版本定于本周四发布。

社区

最后但同样重要的是,感谢在 Spring for GraphQL 问题跟踪器中持续提供反馈和讨论。我们非常感谢这些意见,它们让项目变得更强大、更好!

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

超越他人

VMware 提供培训和认证,助您加速发展。

了解更多

获得支持

Tanzu Spring 通过简单的单一订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区中所有即将到来的活动。

查看全部