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支持会检查查询中选择的字段,并仅提取底层域实体的相应属性。

类型解析器

现在对GraphQL联合和接口的类型解析器有内置支持。默认情况下,它尝试将Java类的简单名称与GraphQL对象类型匹配,并且它也尝试类层次结构中的超类型。

还有其他选项可以自定义此行为,以提供足够的提示来将具体的Java类与GraphQL对象类型匹配。请尝试一下,并告诉我们它运行得如何,或者您是否需要围绕此功能的更多灵活性。

输入参数的数据绑定器

GraphQL Java 将输入参数解析为泛型数据映射。Spring GraphQL 现在使用 Spring Framework 的DataBinder机制将这些映射转换为在@Argument控制器方法参数上声明的类型化对象。如果需要,您可以将ConversionService连接到DataBinder中以转换各个输入字段。

WebSocket拦截器

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

CORS配置

Spring GraphQL Boot启动器提供spring.graphql.cors.*属性来配置公开的GraphQL端点的CORS。

GraphQLTester的查询文件

此版本基于GraphQlTesterAPI和测试自动配置,可帮助您测试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社区中所有即将举行的活动。

查看全部