数据整合
查询dsl
Spring GraphQL 支持使用Querydsl通过 Spring Data Querydsl 扩展来获取数据。Querydsl 提供了一种灵活但类型安全的方法,通过使用注释处理器生成元模型来表达谓词。
例如,将存储库声明为QuerydslPredicateExecutor:
公共接口 AccountRepository 扩展了 Repository<Account, Long>,
QuerydslPredicateExecutor<Account> {
}
然后用它来创建一个DataFetcher:
// 对于单结果查询
DataFetcher<Account> dataFetcher =
QuerydslDataFetcher.builder(repository).single();
// 对于多结果查询
DataFetcher<Iterable<Account>> dataFetcher =
QuerydslDataFetcher.builder(repository).many();
所述DataFetcher构建一个QuerydslPredicate从GraphQL请求参数,并使用它来获取数据。Spring Data支持QuerydslPredicateExecutorJPA、MongoDB和LDAP。
如果存储库是ReactiveQuerydslPredicateExecutor,则构建器返回DataFetcher<Mono<Account>>或DataFetcher<Flux<Account>>。Spring Data 为 MongoDB 支持此变体。
Spring GraphQL 存储库中的 webmvc-http 示例使用 Querydsl 来获取artifactRepositories。
定制
Querydsl 允许集成Predicate通过接受一个来自定义绑定到一个的请求QuerydslBinderCustomizer。对于请求中的可用参数,请求参数默认绑定为“等于”。
QuerydslDataFetcher支持接口和DTO投影以在返回查询结果以进行进一步的GraphQL处理之前的转换查询结果。
自动注册
QuerydslDataFetcher公开一个GraphQLTypeVisitor查找返回类型与一个或多个查询存储库的域类型匹配的查询查询,并DataFetcher为每个匹配的查询注册一个。这包括返回值的单个查询和返回列表的查询。
存储库必须使用@GraphQlRepository。默认情况下,查询返回的 GraphQL 类型名称必须与存储库域类型的简单名称匹配。如果它们不匹配,您可以使用的typeName属性@GraphQlRepository来设置 GraphQL 类型名称。
突发事件库会在Boot starter中自动检测。
安全
可以使用 HTTP URL 安全保护 Web GraphQL 到这个入口的路径,以确保能够通过身份验证的用户访问它。但是,同时个别 URL 上不同的本地共享路径上的 GraphQL 请求。
要应用更细粒度的安全性,Spring Security 中注释添加到涉及获取 GraphQL 响应的特定部分的服务方法,例如@PreAuthorize或@Secured。由于上下文传达使安全性和其他上下文在数据获取级别可用,因此应该是
Spring GraphQL 存储库包含 Spring MVC 和 WebFlux 的示例。
测试
您可以使用 Spring 的测试 GraphQL 请求WebTestClient,非常发送和接收 JSON,但许多 GraphQL 特定细节使这种方法比有的更麻烦。
GraphQlTester
GraphQlTester 定义了一个工作流来测试 GraphQL 请求,具有以下优点:
验证GraphQL响应为200(OK)。验证响应中“错误”键下没有出现错误。在响应中的“数据”键下解码。使用 JsonPath 解码响应的不同部分。测试订阅。
要创建GraphQlTester,您只需要一个GraphQlService,不需要传输:
GraphQlSource graphQlSource = GraphQlSource.builder()
.schemaResources(...)
.runtimeWiring(...)
。建造();
GraphQlService graphQlService = new ExecutionGraphQlService(graphQlSource);
GraphQlTester graphQlTester = GraphQlTester.builder(graphQlService).build();
WebGraphQlTester
WebGraphQlTester扩展GraphQlTester传输以添加特定于Web 的工作流和配置。您需要以下输入一个来创建它:
WebTestClient — HTTP 客户端执行请求,无论是针对没有服务器的 HTTP 处理程序,还是针对实时服务器。WebGraphQlHandler ——通过HTTP和WebSocket处理程序使用的Web拦截链执行请求,这实际上是在没有Web框架的情况下进行测试。使用的一个原因是订阅。
如果没有 WebFlux,你可以服务的 Spring 你的 Spring 配置:
ApplicationContext 上下文 = ... ;
WebTestClient 客户端 =
WebTestClient.bindToApplicationContext(上下文)
.configureClient()
.baseUrl("/graphql")
。建造();
WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();
对于没有服务器的Spring MVC,请使用MockMvcWebTestClient构建器:
WebApplicationContext 上下文 = ... ;
WebTestClient 客户端 =
MockMvcWebTestClient.bindToApplicationContext(context)
.configureClient()
.baseUrl("/graphql")
。建造();
WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();
对于实时运行的服务器的测试:
WebTestClient 客户端 =
WebTestClient.bindToServer()
.baseUrl("http://localhost:8080/graphql")
。建造();
WebGraphQlTester 测试器 = WebGraphQlTester.builder(client).build();
查询
下面是使用JsonPath提取GraphQL响应中的所有发布版本的示例查询测试。
字符串查询 = "{" +
" 项目(slug:\"spring-framework\") {" +
" 发布 {" +
"版本" +
" }"+
" }" +
"}";
graphQlTester.query(查询)
。执行()
.path("project.releases[*].version")
.entityList(String.class)
.hasSizeGreaterThan(1);
JsonPath相对于响应的“数据”部分。
错误
测试不能使用数据,如果在响应中出现错误的“错误”键下有错误。 如果需要忽略错误,请使用错误过滤器Predicate:
graphQlTester.query(查询)
。执行()
.错误()
.filter(错误 -> ...)
。核实()
.path("project.releases[*].version")
.entityList(String.class)
.hasSizeGreaterThan(1);
错误过滤器可以注册并渗入所有测试:
WebGraphQlTester graphQlTester = WebGraphQlTester.builder(client)
.errorFilter(error -> ...)
。建造();
或者直接检查所有错误,将它们标记为已过滤:
graphQlTester.query(查询)
。执行()
.错误()
.satisfy(错误 -> {
// ...
});
如果请求没有任何响应数据(例如状态),则使用executeAndVerify代替execute来验证响应中没有错误:
graphQlTester.query(query).executeAndVerify();
订阅
该executeSubscription方法定义了特定于该订阅的工作流,工作流返回响应流而不是单个响应。
要测试订阅,您可以GraphQlTester创建创建GraphQlService,graphql.GraphQL直接调用并返回响应流:
GraphQlService 服务 = ... ;
GraphQlTester graphQlTester = GraphQlTester.builder(service).build();
Flux<String> result = graphQlTester.query("订阅{问候}")
.executeSubscription()
.toFlux("问候", String.class); // 解码每个响应
该StepVerifier验证流从工程反应堆成堆的:
Flux<String> result = graphQlTester.query("订阅{问候}")
.executeSubscription()
.toFlux("问候", String.class);
StepVerifier.create(result)
.expectNext("嗨")
.expectNext("卓悦")
.expectNext("你好")
.verifyComplete();
要使用Web拦截链进行测试,您可以创建WebGraphQlTester一个WebGraphQlHandler:
GraphQlService 服务 = ... ;
WebGraphQlHandler 处理程序 = WebGraphQlHandler.builder(service)
.interceptor((input, next) -> next.handle(input))
。建造();
WebGraphQlTester graphQlTester = WebGraphQlTester.builder(handler).build();
目前,Spring GraphQL 不支持使用 WebSocket 客户端进行测试,也不能用于 GraphQL 对 WebSocket 请求的集成测试。
未完待续……