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。
未完待续……