Spring for GraphQL 1.1.0 发布

发布 | Brian Clozel | 2022 年 11 月 23 日 | ...

我很高兴地宣布 Spring for GraphQL 1.1.0 现已在 Maven Central 上可用。此版本将在本周晚些时候与 Spring Boot 3.0.0 一起发布。

Spring for GraphQL 1.0.0 于 6 个月前发布,那么为什么现在要发布新的次要版本呢?团队最初计划发布 1.1.0 版本,目标只有一个:支持 Spring Framework 6.0 / Spring Boot 3.0 并适应该代的新基线

  • Java 17
  • Jakarta EE 9
  • GraphQL Java 19

此外,我们还发布了一些您可能喜欢的新功能和值得注意的功能

可观察性

可观察性是这个新的 Spring Framework 6 主要版本中 Spring 产品组合中的一个主要主题。Spring 项目现在拥有自己的内置指标和跟踪检测功能,这些功能基于来自 Micrometer 的新的 Observation API。Spring for GraphQL 中的此新检测功能取代了 Spring Boot 2.7 中的以前的 GraphQL 指标支持。这对于跟踪 GraphQL API 的性能指标以及探索跟踪和调查生产问题非常重要。总的来说,GraphQL 是可观察性的一个很好的用例,因为 GraphQL 引擎可以在 REST API、数据存储、缓存等方面扩展数据获取。

上下文传播

可观察性依赖于透明的上下文传播。这对于 GraphQL 应用程序尤其重要,因为请求可能从 HTTP 处理程序开始,并导致对许多DataFetcher组件的调用,这些组件中的每一个都可能是异步的,并且在 Spring for GraphQL 中也是反应式的。

在 1.0 版本中,我们提供了ThreadLocalAccessor契约,允许应用程序将任何ThreadLocal挂钩到上下文传播中。对于 1.1 版本,我们与 Micrometer 和 Reactor 团队合作提取了一个单独的库,这就是导致Micrometer 上下文传播库的原因。

在 1.1 版本中,上下文传播基于此新库。它应该以相同的方式工作,但您的ThreadLocalAccessor实现需要切换到新库中的契约。这样做也有好处。新库提供了一种更透明、更灵活的机制,以及一个专用的公共 API 来注册访问器、获取快照、恢复上下文等等,所有这些都提高了其可用性并为应用程序提供了更多控制权。

例如,来自 HTTP 层(例如 Spring MVC)的ThreadLocal值现在将显示为GraphQLContext中的键值对,该上下文暴露给DataFetcher组件,因此控制器方法可以通过@ContextValue访问它。

AOT 和 GraalVM 原生镜像

Spring Framework 6 和 Spring Boot 3.0 引入了对使用 GraalVM 的原生镜像编译器构建内存高效且快速的、特定于操作系统和体系结构的原生二进制文件的支持。为了在 Spring for GraphQL 应用程序中启用此功能,我们首先与 GraphQL Java 团队合作,为 GraalVM 可达性元数据存储库贡献 GraphQL Java 元数据,这有利于整个 Java 社区,而不仅仅是 Spring 应用程序。这涵盖了 GraphQL Java 本身,但 GraphQL Java 引擎还需要对映射到模式的应用程序 Java 类型执行反射。为了适应这一点,我们还创建了一个专用的 AOT 处理器,它在构建时检查您的 GraphQL 控制器,并进行必要的注册。

如果您想尝试一下,请先参考Spring Boot 关于原生镜像的参考文档,并关注Spring Boot Wiki 上的最新更新

参数绑定

我们收到了很多关于参数绑定的宝贵反馈。我们使用 Spring Framework 的DataBinder从 GraphQL 参数映射绑定到@Argument方法参数的方式存在一些限制。这包括目标对象上非有序集合类型、泛型和其他特定场景。

此外,一个主要的需求是支持 GraphQL 可空性,它区分显式设置为null的输入参数与完全省略的输入参数。这通常用于支持部分更新。但是,通过将参数绑定到更高级别的对象,结果对象图中仅仅的null属性并不能帮助区分该值是客户端设置为null还是根本没有提供。

在 1.1 版本中,我们对GraphQlArgumentBinder进行了以下更改,以解锁更多可能性

  • 绑定到所有类型的集合(ListMapSet
  • 对于高级情况,不需要构造函数绑定
  • 新的ArgumentValue包装类型,它会公开有关参数是否完全省略的信息

对于 1.1,我们没有时间正确处理诸如分页/中继之类的重要功能,但我们一直在倾听社区的声音。我们正在制定下一个功能版本的路线图,所以现在是时候对现有问题进行投票以表明您的兴趣了!

您如何提供帮助?

如果您有任何一般性问题,请在stackoverflow.com上使用spring-graphql标签提问。

项目页面 | GitHub | 问题 | 文档 | Stack Overflow

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

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

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部