SpringGraphQL为构建在GraphQLJava上的Spring应用提供支持。两个团队之间的联合联合。我们的共同理念是少一些固执己见,更多地关注全面和广泛??的支持。SpringGraphQL是GraphQLJava团队的GraphQLJavaSpring项目的继承者。它将成为所有Spring、GraphQL应用程序的基础。网络传输SpringGraphQL支持通过HTTP和WebSocket的GraphQL请求。HTTPGraphQlHttpHandler通过HTTP请求处理GraphQL,并委托给Web拦截器来执行请求。有两种变体,一种用于SpringMVC,一种用于SpringWebFlux。分别依靠循环和非循环I/O来编写HTTP响应。请求必须使用HTTPPOST,并且GraphQL请求详细信息作为JSON包含在请求文本中,如提议的GraphQLoverHTTP规范中所定义。成功解码JSON文字后,HTTP响应状态始终为200(OK),执行GraphQL请求时出现的任何错误都会出现在GraphQL响应的“错误”部分。GraphQlHttpHandler可以通过声明RouterFunctionbean并使用来自SpringMVC或WebFlux的RouterFunctions创建路由来公开公开为HTTP。启动启动器来执行此操作。SpringGraphQL存储库包含一个SpringMVCHTTP示例应用程序。网络结果GraphQlWebSocketHandler基于graphql协议,通过WebSocket请求处理Graphws库。在WebSockets上使用GraphQL的结果是订阅,它允许发送一串GraphQL响应,但它也可以用于具有一个响应的频繁查询处理程序。请求被委托给Web拦截链以进一步执行请求。GraphQlWebSocketHandler有两种变体,一种用于SpringMVC,另一种用于SpringWebFlux。Reflow处理请求,具有强大的压力处理能力。消息,之所以有效,是因为在GraphQLJava中订阅响应是一个ReactiveStreamsPublisher。graphql-ws项目有所有可供客户使用的方法。GraphQlWebSocketHandler通过声明SimpleUrlHandlerMappingbean作为WebSocket要求公开,并且可以使用通信处理程序映射到URL路径。启动器有一个选项来启用此功能,请参阅网页了解详细信息或检查或配置,例如。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfigurationSpringGraphQL存储库包含一个WebFluxWebSocket示例应用程序。Web拦截HTTP和WebSocket传输处理程序委托给公共网络拦截链来执行请求。该链应由一系列WebInterceptor组件组成,一个Java引擎,然后是对GraphQL的GraphQlService调用。WebInterceptor在SpringMVC和WebFlux应用程序中使用的通用组件。使用它来拦截请求、检查HTTP请求标头或为graphql.ExecutionInput注册转换:>{Mapmap=...;returnbuilder.extensions(map).build();});返回next.handle(webInput);}}使用WebInterceptor也拦截响应,添加HTTP响应标头,或转换graphql.ExecutionResult:(webOutput->{objectdata=webOutput.getData();objectupdateddata=...;returnwebOutput.transform(builder->builder.data(updatedData));});}}WebGraphQlHandler提供了一个构建器来初始化Web拦截链。构建链后,您可以使用生成的WebGraphQlHandler来初始化HTTP或WebSocket传输处理程序。启动器配置所有这些,详情请参阅Web端点,或检查GraphQlWebMvcAutoConfiguration或GraphQlWebFluxAutoConfiguration配置。查询执行GraphQlService是主要的SpringGraphQL抽象,它调用GraphQLJava来执行请求。通过传输,例如Web传输,委托给GraphQlService来处理请求。ExecutionGraphQlService的主要实现是围绕调用graphql.GraphQL的薄外观。它配置一个GraphQlSource来访问graphql.GraphQL实例。GraphQLSourceGraphQlSource是用于访问graphql.GraphQL请求执行实例的核心SpringGraphQL抽象。它提供了一个构建器API来初始化GraphQLJava并构造一个GraphQlSource。GraphQlSource通过可访问的默认构建器GraphQlSource.builder()支持ReactiveDataFetcher、ContextPropagation和ExceptionResolution。ReactiveDataFetcher的默认GraphQlSource构建器已为DataFetcher报告ViewMono或GetiTunesFluxNow启用。任何类型的报告视图都适合具有Flux聚合的CompletableFuture,成为列表值,除非请求是GraphQL订阅请求,在这种情况下,报告视图值保留在非流式发布者的流式GraphQL响应中。ReactiveDataFetchers可以依赖于访问从传输层传播的Reactor上下文,例如来自WebFlux请求处理,请参阅WebFlux上下文。关于SpringGraphQL的传播支持通过GraphQL引擎和DataFetcher调用的其他组件透明地传播来自Web传输的上下文。这包括来自SpringMVC请求处理线程的ThreadLocal上下文和来自WebFlux处理管道的上下文反应器。管理DataFetcherGraphQLJava调用的A和其他组件可能并不总是在与SpringMVC处理程序相同的线程上执行,例如,如果异步WebInterceptor或DataFetcher切换到不同的线程。SpringGraphQL支持将ThreadLocal值从容器线程传播到线程DataFetcher和GraphQL引擎调用的其他组件执行。因此,应用程序需要创建一个ThreadLocalAccessor到ThreadLocal来提取生物的值:publicclassRequestAttributesAccessorimplementsThreadLocalAccessor{@overridepublicvoidExtractValue(Mapcontainer){container.put(KEY,RequestContextHolder.getRequestAttributes());}@overridepublicvoidrestoreValues(Mapvalues){if(values.containsKey(KEY)){RequestContextHolder.setRequestAttributes((RequestAttributes)values.get(KEY));}}@overridepublicvoidresetValues(Mapvalues){RequestContextHolder.resetRequestAttributes();}}可以在WebGraphHandler构建器中注册ThreadLocalAccessor。Bootstarter检测这种类型的bean并自动为SpringMVC应用程序注册它们,请参阅Web端点。网络流量反应式DataFetcher可以从反应式上下文中获取,即WebFlux口头请求处理链。这包括由WebInterceptor组件添加的Reactor上下文。异常解决GraphQLJava应用程序可以注册一个DataFetcherExceptionHandler来决定如何在GraphQL响应的“错误”部分中表示来自数据层的异常。SpringGraphQL有一个内置的DataFetcherExceptionHandler配置供GraphQLSource构建器使用。它会导致应用程序注册一个或多个DataFetcherExceptionResolverSpring组件,这些组件会按顺序调用,直到异常被解析为graphql.GraphQLError对象列表。DataFetcherExceptionResolver是一个异步合约。对于大多数实现,Sydney将扩展DataFetcherExceptionResolverAdapter并覆盖其resolveToSingleError或resolveToMultipleErrors方法之一以同步解决异常。AGraphQLError可以分配一个graphql.ErrorClassification。SpringGraphQL定义了一个常见错误分类类别的ErrorType枚举:BAD_REQUESTUNAUTHORIZEDFORBIDDENNOT_FOUNDINTERNAL_ERROR,应用程序可以使用它来对错误进行分类。如果解析不正确,默认情况下会标记为INTERNAL_ERROR。待续...