Spring GraphQL 1.0.0-M3 发布

版本发布 | Brian Clozel | 2021 年 10 月 28 日 | ...

Spring GraphQL 团队很高兴地宣布 1.0.0 发布版的第三个里程碑,这得益于社区的大力帮助。

批量映射

第二个里程碑引入了带有 @SchemaMapping 方法的 GraphQL 数据控制器的注解编程模型。第三个里程碑增加了一个新的 @BatchMapping 方法。

如果您熟悉 GraphQL,您就会知道,如果不仔细映射对象关系,遍历对象图可能会导致“N+1 查询问题”。我们已经可以利用 GraphQL Java 的 批量处理功能来解决这个问题,但本次发布引入了 专门的支持以及一个 @BatchMapping 注解,以获得更流畅的体验。

@Controller
public class BookController {

    @BatchMapping
    public Mono<Map<Book, Author>> author(List<Book> books) {
        // ...
    }
}

通过这个例子,我们利用 GraphQL 引擎机制,通过一次调用高效地加载多个 Book->Author 关系。

改进的 Querydsl 支持

QuerydslDataFetcher 支持现在会检查查询选择的字段,并只获取底层域实体的相应属性。

类型解析器 (TypeResolver's)

现在为 GraphQL 的 Union 和 Interface 提供了 内置的 TypeResolver 支持。默认情况下,它尝试将 Java 类的简单名称与 GraphQL 对象类型进行匹配,并尝试对该类层次结构中的超类型进行相同的匹配。

还有进一步的选项来定制此行为,以便提供足够的提示来将具体的 Java 类匹配到 GraphQL 对象类型。请尝试一下,并让我们知道它的效果如何,或者您是否需要在此功能方面获得进一步的灵活性。

输入参数的数据绑定器 (DataBinder)

GraphQL Java 将输入参数解析为通用的数据 Map。Spring GraphQL 现在使用 Spring Framework 的 DataBinder 机制将这些 Map 转换为 @Argument 控制器方法参数上声明的类型化对象。您可以钩入 ConversionService 以在 DataBinder 中使用,在需要时转换单个输入字段。

WebSocket 拦截器

现在有一个 WebSocketInterceptor,它是 WebInterceptor 的一个子类型,它还可以处理 WebSocket 连接上的 CONNECTION_INITCOMPLETE 消息,包括访问 CONNECTION_INIT 负载以及拒绝连接的能力。请尝试一下这个功能,并告诉我们是否还需要其他东西。

CORS 配置

Spring GraphQL Boot starter 提供了 spring.graphql.cors.* 属性来配置暴露的 GraphQL 端点的 CORS。

GraphQlTester 的查询文件

此版本构建在 GraphQlTester API 和测试自动配置的基础上,以帮助您测试 Spring GraphQL 应用程序。

GraphQlTester 现在支持在测试中使用 *.graphql 查询文件,作为在 Java 测试类中内联编写查询的替代方案。假定您的测试资源中有一个 projectReleases.graphql 文件

query projectReleases($slug: ID!) {
    project(slug: $slug) {
        releases {
            version
        }
    }
}

您现在可以在测试中引用此查询文件

graphQlTester.queryName("projectReleases") 
        .variable("slug", "spring-framework") 
        .execute()
        .path("project.releases[*].version")
        .entityList(String.class)
        .hasSizeGreaterThan(1);

IntelliJ 的“JS GraphQL”插件支持带代码补全的 GraphQL 查询文件。

@GraphQlTest 的“分片测试”支持

最后但同样重要的是,我们现在提供了一个新的 @GraphQlTest 测试工具,它与 @WebMvcTest@JsonTest Spring Boot 注解非常相似。有了它,您可以编写 依赖于应用程序特定部分的集成测试。无需加载整个应用程序上下文,只考虑相关部分,这样就可以轻松地进行模拟和测试,而无需涉及过多的基础设施。

在这个例子中,我们正在测试我们的 BookController,以确保它得到正确实现 - 无需设置复杂的数据夹具,因为我们可以模拟存储库。

@GraphQlTest(controllers = BookController.class)
public class BookControllerTests {

    @Autowired
    private GraphQlTester graphQlTester;

    @MockBean
    private BookRepository bookRepository;

    @Test
    void bookdByIdShouldReturnSpringBook() {
        given(this.bookRepository.findById(42L)).willReturn(new Book(42L, "Spring GraphQL"));
        String query = """
			{
			  bookById(id: "42"){
			    id
			    name
			  }
			}
			""";
        this.graphQlTester.query(query).execute()
                .path("data.bookById.name").entity(String.class).isEqualTo("Spring GraphQL");
    }

}

本次发布还包含更多 改进和修复,它们现已在 Spring Milestone 存储库中的新 Spring GraphQL 1.0.0-M3 中提供。

你如何提供帮助?

如果您有兴趣提供帮助,您可以 开始使用 Spring GraphQL在我们的 GitHub 项目上提交问题。如果您有一般性问题,请使用 spring-graphql 标签stackoverflow.com 上提问。

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有