第一课:https://cloud.tencent.com/developer/article/1857280
第二课:https://cloud.tencent.com/developer/article/1857816
这个项目建立在 Boot 2.5.x 上,但它应该与最新的 Boot 2.4.x 兼容。
要创建项目,请转到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
手动添加:
dependencies {
// Spring GraphQL Boot starte
implementation 'org.springframework.experimental:graphql-spring-boot-starter:1.0.0-SNAPSHOT'
// ...
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' } // Spring milestones
maven { url 'https://repo.spring.io/snapshot' } // Spring snapshots
}
默认情况下,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引擎豆类和使用这些登记的数据取程序,型旋转变压器,和更多:
@Component
public class PersonDataWiring implements RuntimeWiringConfigurer {
private final PersonService service;
public PersonDataWiring(PersonService service) {
this.service = service;
}
@Override
public void configure(RuntimeWiring.Builder builder) {
builder.type("Query", wiring ->
wiring.dataFetcher("people", env -> this.service.findAll()));
}
}
扩展QuerydslPredicateExecutor
或ReactiveQuerydslPredicateExecutor
注释的Spring Data 存储库@GraphQlRepository
被检测并视为DataFetcher
自动注册以匹配顶级查询的候选者。
默认情况下,GraphQL HTTP 端点位于 HTTP POST“/graphql”。路径可以自定义:
spring.graphql.path=/graphql
默认情况下,GraphQL WebSocket 端点支持“/graphql”处的 WebSocket 握手。下面显示了适用于 WebSocket 处理的属性:
spring.graphql.websocket.path=/graphql
# Time within which a "CONNECTION_INIT" message must be received from the client
spring.graphql.websocket.connection-init-timeout=60s
GraphQL WebSocket 端点默认关闭。要启用它:
spring-boot-starter-websocket
。spring.graphql.websocket.path
application 属性。声明一个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
可用于注入测试:
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.graphql:spring-graphql-test:1.0.0-SNAPSHOT'
// Also add this, unless spring-boot-starter-webflux is also present
testImplementation 'org.springframework:spring-webflux'
// ...
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' } // Spring milestones
maven { url 'https://repo.spring.io/snapshot' } // Spring snapshots
}
对于带有 Spring MVC 的基于 HTTP 的 GraphQL,使用MockMvc
作为服务器:
@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureGraphQlTeste
public class MockMvcGraphQlTests {
@Autowired
private WebGraphQlTester graphQlTester;
}
对于带有 Spring WebFlux 的基于 HTTP 的 GraphQL,使用模拟服务器:
@SpringBootTest
@AutoConfigureWebTestClient
@AutoConfigureGraphQlTeste
public class MockMvcGraphQlTests {
@Autowired
private WebGraphQlTester graphQlTester;
}
对于GraphQL通过HTTP与正在运行的服务器:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureGraphQlTeste
public class MockMvcGraphQlTests {
@Autowired
private WebGraphQlTester graphQlTester;
}
订阅可以在没有 WebSocket 的情况下进行测试,如下所示:
@SpringBootTest
@AutoConfigureGraphQlTeste
public class MockMvcGraphQlTests {
@Autowired
private WebGraphQlTester graphQlTester;
@Test
void subscription() {
Flux<String> result = this.graphQlTester.query("subscription { greetings }")
.executeSubscription()
.toFlux("greetings", String.class);
// Use StepVerifier from "reactor-test" to verify the stream...
StepVerifier.create(result)
.expectNext("Hi")
.expectNext("Bonjour")
.expectNext("Hola")
.verifyComplete();
}
}
上述订阅测试直接针对WebGraphQlHandler
HTTP 和 WebSocket 传输委托的对象执行。它通过WebInterceptor
链,然后调用GraphQL的Java返回一个反应流Publisher
。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。