数据集成查询dslSpringGraphQL支持通过SpringDataQuerydsl扩展使用Querydsl获取数据。Querydsl通过使用注释处理器生成元模型,提供了一种灵活但类型安全的方式来表达谓词。例如,将存储库声明为QuerydslPredicateExecutor:publicinterfaceAccountRepositoryextendsRepository,QuerydslPredicateExecutor{}然后使用它来创建DataFetcher://对于单个结果查询DataFetcherdataFetcher=QuerydslDataFetcher.builder(repository).single();//用于多结果查询DataFetcher>dataFetcher=QuerydslDataFetcher.builder(repository).many();DataFetcher从GraphQL请求参数构建一个QuerydslPredicate并使用它来获取数据。SpringData支持QuerydslPredicateExecutorJPA、MongoDB和LDAP。如果存储库是ReactiveQuerydslPredicateExecutor,则构建器返回DataFetcher>或DataFetcher>。SpringData支持MongoDB的这种变体。SpringGraphQL存储库中的webmvc-http示例使用Querydsl来获取artifactRepositories。自定义Querydsl允许通过接受自定义绑定到QuerydslBinderCustomizer的请求来集成谓词。对于请求中的可用参数,请求参数的默认绑定是“等于”。QuerydslDataFetcher支持接口和DTO投影以在返回查询结果以供进一步GraphQL处理之前转换查询结果。自动注册的QuerydslDataFetcher公开了一个GraphQLTypeVisitor,它查找返回类型与一个或多个查询存储库的域类型匹配的查询查询,DataFetcher为每个匹配的查询注册一个。这包括返回值的单个查询和返回列表的查询。存储库必须使用@GraphQlRepository。默认情况下,查询返回的GraphQL类型名称必须与存储库域类型的简单名称相匹配。如果它们不匹配,您可以使用@GraphQlRepository的typeName属性来设置GraphQL类型名称。紧急库会在Bootstarter中自动检测到。安全性可以使用HTTPURL安全性来保护此入口的WebGraphQL路径,以确保经过身份验证的用户可以访问它。但是,同时GraphQL请求各个URL上的不同本地共享路径。为了应用更细粒度的安全性,SpringSecurity注释被添加到服务方法中,这些方法涉及获取GraphQL响应的特定部分,例如@PreAuthorize或@Secured。由于上下文通信使安全性和其他上下文在数据获取级别可用,因此它应该是包含SpringMVC和WebFlux示例的SpringGraphQL存储库。测试你可以使用Spring的测试GraphQL请求WebTestClient,非常发送和接收JSON,但是一些GraphQL特定的细节使得这种方法比它应该的更麻烦。GraphQlTesterGraphQlTester定义了一个工作流来测试GraphQL请求,具有以下好处:使用200(OK)验证GraphQL响应。验证响应中的“错误”键下没有出现错误。在响应中的“数据”键下解码。使用JsonPath解码响应的不同部分。测试订阅。要创建一个GraphQlTester,您只需要一个GraphQlService,不需要传输:GraphQlSourcegraphQlSource=GraphQlSource.builder().schemaResources(...).runtimeWiring(...)。建造();GraphQlServicegraphQlService=newExecutionGraphQlService(graphQlSource);GraphQlTestergraphQlTester=GraphQlTester.builder(graphQlService).build();WebGraphQlTesterWebGraphQlTester扩展了GraphQlTester传输以添加特定于Web的工作流和配置。您将需要以下输入之一来创建它:WebTestClient?—HTTP客户端,用于执行请求,请求可以发送到没有服务器的HTTP处理程序,也可以发送到实时服务器。WebGraphQlHandler?-通过HTTP和WebSocket处理程序使用的Web拦截链执行请求,这实际上是在没有Web框架的情况下测试的。使用的原因之一是订阅。没有WebFlux,你可以支持你的Spring配置:ApplicationContextcontext=...;WebTestClient客户端=WebTestClient.bindToApplicationContext(context).configureClient().baseUrl("/graphql")。建造();WebGraphQlTester测试器=WebGraphQlTester.builder(client).build();对于没有服务器的SpringMVC,使用MockMvcWebTestClient构建器:WebApplicationContextcontext=...;WebTestClient客户端=MockMvcWebTestClient.bindToApplicationContext(context)。configureClient().baseUrl("/graphql")。建造();WebGraphQlTester测试器=WebGraphQlTester.builder(client).build();对于实时运行的服务器测试:WebTestClientclient=WebTestClient.bindToServer().baseUrl("http://localhost:8080/graphql")。建造();WebGraphQlTester测试器=WebGraphQlTester.builder(client).build();查询下面是一个使用JsonPath提取GraphQL响应中所有已发布构建的示例查询测试。stringquery="{"+"project(slug:\"spring-framework\"){"+"release{"+"version"+"}"+"}"+"}";graphQlTester.query(查询)。execute().path("project.releases[*].version").entityList(String.class).hasSizeGreaterThan(1);JsonPath与响应的“数据”部分相关。如果响应中的“错误”键下有错误,则错误测试无法使用数据。如果您需要忽略错误,请使用错误过滤器Predicate:graphQlTester.query(query)。execute().error().filter(error->...)。verify().path("project.releases[*].version").entityList(String.class).hasSizeGreaterThan(1);错误过滤器可以注册并渗透到所有测试中:WebGraphQlTestergraphQlTester=WebGraphQlTester.builder(client)。错误过滤器(错误->...)。建造();或直接检查所有错误,将它们标记为已过滤:graphQlTester.query(query)。execute().error().satisfy(error->{//...});如果请求没有任何响应数据(例如状态),请使用executeAndVerify而不是execute来验证响应中没有错误:graphQlTester.query(query).executeAndVerify();订阅executeSubscription方法定义了一个特定于此订阅的工作流,该工作流返回响应流而不是单个响应。测试订阅,可以创建GraphQlTester创建GraphQlService,graphql.GraphQL直接调用并返回响应流:GraphQlServiceservice=...;GraphQlTestergraphQlTester=GraphQlTester.builder(service).build();Flux结果=graphQlTester。query("Subscription{Greeting}").executeSubscription().toFlux("Greeting",String.class);//解码来自项目Reactor堆栈的对StepVerifier验证流的每个响应:Fluxresult=graphQlTester.query("订阅{greeting}").executeSubscription().toFlux("greeting",String.class);StepVerifier.create(result).expectNext("Hi").expectNext("Bonjoy").expectNext("YouOK").verifyComplete();要使用web拦截链进行测试,可以创建一个WebGraphQlTester一个WebGraphQlHandler:GraphQlServiceservice=...;WebGraphQlHandlerhandler=WebGraphQlHandler.builder(service).interceptor((input,next)->next.handle(input)).建造();WebGraphQlTestergraphQlTester=WebGraphQlTester.builder(handler).build();目前,SpringGraphQL不支持使用WebSocket客户端进行测试,也不能用于WebSocket请求的GraphQL集成测试。待续...