第一课:https://www.imooc.com/article/319866
第二课:https://www.imooc.com/article/319915
这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。
要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器:
启动机 | 运输 | 执行 |
---|---|---|
spring-boot-starter-web | HTTP | 春季MVC |
spring-boot-starter-websocket | 网络结果 | 用于 Servlet 应用程序的 WebSocket |
spring-boot-starter-webflux | HTTP、WebSocket | 弹簧 WebFlux |
在生成的项目中,graphql-spring-boot-starter
手动添加:
依赖{
// Spring GraphQL 启动
实现 'org.springframework.experimental:graphql-spring-boot-starter:1.0.0-SNAPSHOT'
// ...
}
存储库{
MavenCentral()
maven { url 'https://repo.spring.io/milestone' } // 春季里程碑
maven { url 'https://repo.spring.io/snapshot' } // Spring 快照
}
默认情况下,GraphQL 架构文件将在src/main/resources/graphql
与扩展名“.graphqls”,“.graphql”,“.gql”,或“.gqls”。您可以自定义要检查的目录位置,如下所示:
spring.graphql.schema.locations=classpath:graphql/
所述模式模式可以在“/GraphQL/模式”被graphQL通过HTTP。这不是默认允许的:
spring.graphql.schema.printer.enabled=false
你可以声明RuntimeWiringConfigurer
在 Spring 的配置与 GraphQL 引擎豆类和使用这些登记的数据获取程序,类型旋转变压器,和更多:
@成分
公共类 PersonDataWiring 实现 RuntimeWiringConfigurer {
私有的最终 PersonService 服务;
公共 PersonDataWiring(PersonService 服务){
this.service = 服务;
}
@覆盖
公共无效配置(RuntimeWiring.Builder builder){
builder.type("查询", 接线 ->
Wiring.dataFetcher("people", env -> this.service.findAll()));
}
}
扩展QuerydslPredicateExecutor
或扩展或ReactiveQuerydslPredicateExecutor
存储库@GraphQlRepository
被检测到的 Spring Data并决定DataFetcher
自动注册以匹配环境查询的候选者。
默认情况下,GraphQL HTTP 访问地址 HTTP POST“/graphql”。路径可以自定义:
spring.graphql.path=/graphql
默认情况下,GraphQL WebSocket 支持“/graphql”处的 WebSocket。下面显示了适用于 WebSocket 处理的属性:
spring.graphql.websocket.path=/graphql
# 必须从客户端收到“CONNECTION_INIT”消息的时间
spring.graphql.websocket.connection-init-timeout=60s
GraphQL WebSocket 默认关闭。要启用它:
对于 Servlet 应用程序,添加 WebSocket starter spring-boot-starter-websocket
。
对于 WebFlux 应用程序,设置spring.graphql.websocket.path
应用程序属性。
声明一个WebInterceptor
bean,通过HTTP和WebSocket请求在GraphQL的Web拦截中注册。
声明一个ThreadLocalAccessor
bean 以帮助传播 Spring MVCThreadLocal
中老鼠的价值。
Spring Boot 启动器包含一个GraphiQL页面,默认情况下该页面在“/graphiql”中公开。您可以按如下方式配置:
spring.graphql.graphiql.enabled=true
spring.graphql.graphiql.path=/graphiql
当启动器spring-boot-starter-actuator
出现在类路径上时,将收集GraphQL请求的指标。您可以按以下方式寻找指标收集:
management.metrics.graphql.autotime.enabled=false
以下部分可能在您的应用程序配置中,可以通过Actuator Web 指标公开。如下所示:
management.endpoints.web.exposure.include=health,metrics,info
请求访问位置/actuator/metrics/graphql.request
。
标签 | 描述 | 样本值 |
---|---|---|
结果 | 请求结果 | “成功”、“错误” |
一个DataFetcher
指标定时器可在/actuator/metrics/graphql.datafetcher
。
标签 | 描述 | 样本值 |
---|---|---|
小路 | 数据获取器路径 | “查询.项目” |
结果 | 数据获取结果 | “成功”、“错误” |
GraphQL 错误点击选择所在的位置/actuator/metrics/graphql.error
。
标签 | 描述 | 样本值 |
---|---|---|
错误类型 | 错误类型 | “数据获取异常” |
错误的路径 | 错误 JSON 路径 | “$.project” |
Spring GraphQL 测试支持,将以下内容添加到您的类路径中,这是一个WebGraphQlTester
可用于注入测试的团队:
依赖{
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.graphql:spring-graphql-test:1.0.0-SNAPSHOT'
// 也添加这个,除非 spring-boot-starter-webflux 也存在
testImplementation 'org.springframework:spring-webflux'
// ...
}
存储库{
MavenCentral()
maven { url 'https://repo.spring.io/milestone' } // 春季里程碑
maven { url 'https://repo.spring.io/snapshot' } // Spring 快照
}
对于 Spring MVC 的基于 HTTP 的 GraphQL,用作MockMvc
服务器:
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureGraphQlTeste
公共类 MockMvcGraphQlTests {
@自动连线
私有 WebGraphQlTester graphQlTester;
}
针对 Spring WebFlux 的基于 HTTP 的 GraphQL,使用模拟服务器:
@SpringBootTest
@AutoConfigureWebTestClient
@AutoConfigureGraphQlTeste
公共类 MockMvcGraphQlTests {
@自动连线
私有 WebGraphQlTester graphQlTester;
}
对于GraphQL通过HTTP与正在运行的服务器:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureGraphQlTeste
公共类 MockMvcGraphQlTests {
@自动连线
私有 WebGraphQlTester graphQlTester;
}
订阅可以在没有 WebSocket 的情况下进行测试,如下所示:
@SpringBootTest
@AutoConfigureGraphQlTeste
公共类 MockMvcGraphQlTests {
@自动连线
私有 WebGraphQlTester graphQlTester;
@测试
无效订阅(){
Flux<String> result = this.graphQlTester.query("订阅{问候}")
.executeSubscription()
.toFlux("问候", String.class);
// 使用“reactor-test”中的 StepVerifier 来验证流...
StepVerifier.create(result)
.expectNext("嗨")
.expectNext("卓悦")
.expectNext("你好")
.verifyComplete();
}
}
订阅测试直接针对WebGraphQlHandler
HTTP和WebSocket传输委托的对象执行。它通过WebInterceptor
链,然后调用GraphQL的Java返回一个响应流Publisher
。