Spring GraphQL 为构建在 GraphQL Java 上的 Spring 应用程序提供反对。两个团队之间的联结联结。咱们的独特理念是少回心转意,更专一于全面和宽泛的反对。

Spring GraphQL 是 GraphQL Java 团队的 GraphQL Java Spring 我的项目的继承者。它将成为所有 Spring、GraphQL 应用程序的根底。

网络传输
Spring GraphQL 反对通过 HTTP 和 WebSocket 的 GraphQL 申请。

HTTP
GraphQlHttpHandler通过 HTTP 申请解决 GraphQL,并委托给 Web 拦挡执行申请。有两种变体,一种用于 Spring MVC,一种用于 Spring WebFlux。别离依赖周期性和非周期性 I/O 来写 HTTP 响应。

申请必须应用 HTTP POST 和 GraphQL 申请详细信息作为 JSON 蕴含在申请注释中,如提议的 GraphQL over HTTP 标准中定义。胜利解码 JSON 注释后,HTTP 响应状态始终为 200(OK),并且 GraphQL 申请执行中任何谬误都呈现在 GraphQL 响应的“谬误”局部。

GraphQlHttpHandler能够通过申明一个RouterFunctionbean 并应用RouterFunctions来自 Spring MVC 或 WebFlux 的来创立路由来作为 HTTP 公开公开。启动启动器执行此操作。

Spring GraphQL 存储库蕴含一个 Spring MVC HTTP 示例应用程序。

网络后果
GraphQlWebSocketHandler基于graphql的协定通过WebSocket申请解决Graphws库。在WebSocket上应用GraphQL的后果是订阅,它容许发送GraphQL响应流,但它也能够用于有一次响应的常常查问处理程序。个申请委托给Web拦挡链以进一步执行申请。

有两种变体GraphQlWebSocketHandler,用于一种Spring MVC,用于Spring WebFlux。 回流解决申请并具备弱小的压解决性能。音讯,这很无效,因为在 GraphQL Java 中订阅响应是 Reactive Streams Publisher。

该graphql-ws我的项目曾经全副供客户应用的配方。

GraphQlWebSocketHandler通过申明SimpleUrlHandlerMappingbean 并能够应用通信处理程序映射到 URL 门路来公开为 WebSocket 需要。启动启动器具备启用此性能的选项,详细信息或查看或例如配置,请参阅 Web 页面。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration

Spring GraphQL 存储库蕴含一个 WebFlux WebSocket 示例应用程序。

网页拦挡
HTTP和WebSocket的传输处理程序委托给一个通用的网络拦挡链来执行申请。链该由一系列WebInterceptor组件组成,一个后跟GraphQlService调用GraphQL的Java引擎的。

WebInterceptor在 Spring MVC 和 WebFlux 应用程序中应用的通用组件。应用它来拦挡申请、查看 HTTP 申请标头或注册以下内容的转换graphql.ExecutionInput:

类 MyInterceptor 实现了 WebInterceptor {

@笼罩public Mono<WebOutput> 拦挡(WebInput webInput, WebGraphQlHandler next) {    webInput.configureExecutionInput((executionInput, builder) -> {        Map<String, Object> map = ... ;        返回 builder.extensions(map).build();    });    返回 next.handle(webInput);}

}

应用WebInterceptor也拦挡响应,减少HTTP响应头,或转换graphql.ExecutionResult:

类 MyInterceptor 实现了 WebInterceptor {

@笼罩public Mono<WebOutput> 拦挡(WebInput webInput, WebGraphQlHandler next) {    返回 next.handle(webInput)            .map(webOutput -> {                对象数据 = webOutput.getData();                对象更新数据 = ... ;                返回 webOutput.transform(builder -> builder.data(updatedData));            });}

}

WebGraphQlHandler提供了一个builder来初始化Web拦挡链。构建链后,您能够应用后果WebGraphQlHandler来初始化HTTP或WebSocket传输处理程序。启动器配置了所有这些,无关详细信息,请参见Web Endpoints,或查看GraphQlWebMvcAutoConfiguration或GraphQlWebFluxAutoConfiguration配置。

查问执行
GraphQlService是调用GraphQL Java 来执行申请的次要Spring GraphQL 形象。通过传输,例如Web 传输,委托GraphQlService来解决申请。

次要实现ExecutionGraphQlService是围绕着调用的薄外观graphql.GraphQL。它配置了一个GraphQlSource用于拜访graphql.GraphQL实例。

GraphQLSource
GraphQlSource是外围 Spring GraphQL 形象,用于拜访graphql.GraphQL申请执行的实例。它提供了一个构建器 API 来初始化 GraphQL Java 并构建一个GraphQlSource。

GraphQlSource可通过拜访的默认构建器GraphQlSource.builder()反对Reactive DataFetcher、Context Propagation和Exception Resolution。

反应式 DataFetcher
默认GraphQlSource构建器启用对一个DataFetcher报道查看Mono或的请立刻获取iTunes Flux。报道查看无论类型适宜在一个CompletableFuture与Flux汇集,变成了一个列表值,除非申请是GraphQL订阅申请,这种在状况下报道查看值放弃在无流Publisher的流GraphQL响应。

反应式DataFetcher能够依赖对从传输层流传的 Reactor 上下文的拜访,例如来自 WebFlux 申请解决,请参阅 WebFlux 上下文。

大概流传
Spring GraphQL 反对从Web 传输、通过GraphQL 引擎以及DataFetcher它调用的其余组件通明地流传上下文。这包含ThreadLocal来自SpringMVC 申请解决线程的上下文和Context来自WebFlux 解决管道的Reactor。

网管
DataFetcherGraphQL Java 调用的 A 和其余组件可能并不总是在与 Spring MVC 处理程序雷同的线程上执行,例如如果异步WebInterceptor或DataFetcher切换到不同的线程。

Spring GraphQL 反对将ThreadLocal值从容器线程流传到线程DataFetcher以及由 GraphQL 引擎调用的其余组件执行。因而,应用程序须要创立一个ThreadLocalAccessor来ThreadLocal提取生物的值:

公共类 RequestAttributesAccessor 实现 ThreadLocalAccessor {

private static final String KEY = RequestAttributesAccessor.class.getName();@笼罩公共有效提取值(地图<字符串,对象>容器){    container.put(KEY, RequestContextHolder.getRequestAttributes());}@笼罩public void restoreValues(Map<String, Object> values) {    if (values.containsKey(KEY)) {        RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));    }}@笼罩public void resetValues(Map<String, Object> values) {    RequestContextHolder.resetRequestAttributes();}

}

一个ThreadLocalAccessor能够在 WebGraphHandler 构建器中注册。Boot starter 检测这种类型的 bean 并主动为 Spring MVC 应用程序注册它们,请参见 Web Endpoints。

网络流量
一个反馈DataFetcher能够从获取反馈背景下,WebFlux 口头申请解决链。这包含由 WebInterceptor 组件增加的 Reactor 上下文。

异样解决
GraphQL Java 应用程序能够注册一个DataFetcherExceptionHandler来决定如何在 GraphQL 响应的“谬误”局部中示意来自数据层的异样。

Spring GraphQL 有一个内置的DataFetcherExceptionHandler,配置为供GraphQLSource构建器应用。它使应用程序注册一个或多个DataFetcherExceptionResolver顺序调用的 Spring 组件,直到将解析Exception为graphql.GraphQLError对象列表。

DataFetcherExceptionResolver是一个异步契约。对于大多数实现,这将是悉尼的扩大DataFetcherExceptionResolverAdapter和笼罩其一个resolveToSingleError或resolveToMultipleErrors办法是解决异样同步。

AGraphQLError能够调配一个graphql.ErrorClassification。Spring GraphQL 定义了一个ErrorType常见谬误分类类别的枚举:

BAD_REQUEST
UNAUTHORIZED
FORBIDDEN
NOT_FOUND
INTERNAL_ERROR
应用程序能够应用它来分类谬误。如果它谬误解决,则默认状况下将标记为INTERNAL_ERROR。

未完待续……