乐趣区

关于java:Spring认证什么是Spring-GraphQL

数据整合
查问 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 配置:

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 申请的集成测试。

未完待续……

退出移动版