取得领先
VMware 提供培训和认证,为您的进步加速。
了解更多Spring GraphQL 团队很高兴宣布 1.0.0 版本的第三个里程碑,这在社区的大力帮助下得以实现。
第二个里程碑版本引入了使用 @SchemaMapping 方法的 GraphQL 数据控制器注解编程模型。第三个里程碑版本新增了一个 @BatchMapping 方法。
如果您熟悉 GraphQL,就会知道如果不仔细映射对象关系,遍历对象图可能会导致“N+1 查询问题”。我们已经可以利用 GraphQL Java 的批量处理(Batching)特性来解决这个问题,但此版本引入了专门的支持以及@BatchMapping 注解,以提供更流畅的体验。
@Controller
public class BookController {
    @BatchMapping
    public Mono<Map<Book, Author>> author(List<Book> books) {
        // ...
    }
}
通过这个示例,我们正在使用 GraphQL 引擎机制,通过单次调用高效地加载许多 Book->Author 关系。
QuerydslDataFetcher 支持现在会检查查询中选择的字段,并且只获取底层领域实体中对应的属性。
现在提供了针对 GraphQL Union 和 Interface 的 内置 TypeResolver 支持。默认情况下,它会尝试将 Java 类的简单名称匹配到 GraphQL Object 类型,并且会尝试在类的继承结构中对超类型进行相同的匹配。
还有更多选项可以自定义此行为,以提供足够的提示来将具体的 Java 类匹配到 GraphQL Object 类型。请尝试此功能,并告诉我们它的效果如何,或者您是否需要在此功能方面获得进一步的灵活性。
GraphQL Java 将输入参数解析为通用的数据 Map。Spring GraphQL 现在使用 Spring Framework 的 DataBinder 机制将这些 Map 转换为在 @Argument 控制器方法参数上声明的类型化对象。您可以在 DataBinder 中引入 ConversionService,以便在需要时转换单个输入字段。
现在有一个 WebSocketInterceptor,它是 WebInterceptor 的子类型,也可以处理 WebSocket 连接上的 CONNECTION_INIT 和 COMPLETE 消息,包括访问 CONNECTION_INIT 负载以及拒绝连接的能力。请尝试此功能,并告诉我们是否有任何进一步的需求。
Spring GraphQL Boot Starter 提供了 spring.graphql.cors.* 属性来配置对外暴露的 GraphQL 端点的 CORS。
此版本基于 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 测试工具,它与 Spring Boot 的 @WebMvcTest 和 @JsonTest 注解非常相似。有了它,您可以编写依赖于应用程序特定“切片”的集成测试。无需加载整个应用程序上下文,只需考虑相关部分,这使得模拟和测试变得容易,而无需涉及过多基础设施。
在此示例中,我们正在测试 BookController 以确保其正确实现 - 无需设置复杂的数据夹具,因为我们可以模拟 repository。
@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 repository 中获取新的 Spring GraphQL 1.0.0-M3。
如果您有兴趣提供帮助,可以开始使用 Spring GraphQL 并在我们的 GitHub 项目上提出问题。如果您有一般性问题,请在stackoverflow.com 上使用 spring-graphql 标签提问。
项目主页 | GitHub | 问题 | 文档 | Stack Overflow