此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring GraphQL 1.3.1! |
此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring GraphQL 1.3.1! |
ExecutionGraphQlService
是调用 GraphQL Java 执行的主要 Spring 抽象
请求。底层传输(如 HTTP)委托处理请求。ExecutionGraphQlService
主实现 配置了 a 用于访问要调用的实例。DefaultExecutionGraphQlService
GraphQlSource
graphql.GraphQL
GraphQLSource
GraphQlSource
是公开实例以供使用的协定
包括用于构建该实例的构建器 API。默认构建器可通过 .graphql.GraphQL
GraphQlSource.schemaResourceBuilder()
Boot Starter 创建此构建器的实例并进一步初始化它
要从可配置位置加载架构文件,
公开要应用于的属性,以检测 RuntimeWiringConfigurer
bean、GraphQL 指标的检测 bean、
和 bean 用于异常解析。对于进一步的自定义,您还可以
声明一个 Bean,例如:GraphQlSource.Builder
DataFetcherExceptionResolver
SubscriptionExceptionResolver
GraphQlSourceBuilderCustomizer
@Configuration(proxyBeanMethods = false)
class GraphQlConfig {
@Bean
public GraphQlSourceBuilderCustomizer sourceBuilderCustomizer() {
return (builder) ->
builder.configureGraphQl(graphQlBuilder ->
graphQlBuilder.executionIdProvider(new CustomExecutionIdProvider()));
}
}
架构资源
GraphQlSource.Builder
可以配置一个或多个实例
解析并合并在一起。这意味着架构文件几乎可以从任何位置加载
位置。Resource
默认情况下,启动启动程序会查找带有扩展名的架构文件
“.graphqls”或“.gqls”位置下,通常为 .您还可以使用文件系统位置或任何位置
受 Spring 层次结构支持,包括自定义实现
从远程位置、存储或内存加载架构文件。classpath:graphql/**
src/main/resources/graphql
Resource
用于跨多个类路径查找架构文件
位置,例如跨多个模块。classpath*:graphql/**/ |
架构创建
默认情况下,使用 GraphQL Java 创建 .这适用于典型用途,但如果您需要使用
不同的生成器,例如对于联合,您可以注册回调:GraphQlSource.Builder
SchemaGenerator
graphql.schema.GraphQLSchema
schemaFactory
GraphQlSource.Builder builder = ...
builder.schemaResources(..)
.configureRuntimeWiring(..)
.schemaFactory((typeDefinitionRegistry, runtimeWiring) -> {
// create GraphQLSchema
})
GraphQlSource 部分介绍了如何使用 Spring Boot 进行配置。
有关 Apollo Federation 的示例,请参阅 federation-jvm-spring-example。
RuntimeWiringConfigurer
您可以使用以下设备进行注册:RuntimeWiringConfigurer
-
自定义标量类型。
-
处理代码的指令。
-
接口和联合类型的默认
TypeResolver
。 -
DataFetcher
尽管应用程序通常使用带注释的控制器,并且 这些被检测并注册为 s, 这是一个 .Boot Starter 会自动注册 。DataFetcher
AnnotatedControllerConfigurer
RuntimeWiringConfigurer
AnnotatedControllerConfigurer
GraphQL Java,服务器应用程序仅使用 Jackson 进行数据映射的序列化。 客户端输入被解析为映射。服务器输出将根据字段选择集组合成地图。 这意味着您不能依赖 Jackson 序列化/反序列化批注。 相反,您可以使用自定义标量类型。 |
Boot Starter 检测类型为
在 .这意味着在大多数情况下,您将拥有
在您的配置中类似于以下内容:RuntimeWiringConfigurer
GraphQlSource.Builder
@Configuration
public class GraphQlConfig {
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer(BookRepository repository) {
GraphQLScalarType scalarType = ... ;
SchemaDirectiveWiring directiveWiring = ... ;
DataFetcher dataFetcher = QuerydslDataFetcher.builder(repository).single();
return wiringBuilder -> wiringBuilder
.scalar(scalarType)
.directiveWiring(directiveWiring)
.type("Query", builder -> builder.dataFetcher("book", dataFetcher));
}
}
如果您需要添加一个 ,例如,进行考虑到
schema 定义,实现同时接受 和 输出的替代方法。这允许您添加任何
然后按顺序调用的工厂数。WiringFactory
configure
RuntimeWiring.Builder
List<WiringFactory>
TypeResolver
GraphQlSource.Builder
注册为默认值,用于尚未具有此类注册的 GraphQL 接口和联合
通过 RuntimeWiringConfigurer
。目的
GraphQL Java 中的 a 用于确定值的 GraphQL 对象类型
从 for a GraphQL Interface 或 Union 字段返回。ClassNameTypeResolver
TypeResolver
TypeResolver
DataFetcher
ClassNameTypeResolver
尝试将值的简单类名与 GraphQL 匹配
对象类型,如果不成功,它还会导航其超类型,包括
基类和接口,寻找匹配项。 提供
配置名称提取功能以及 GraphQL 对象类型的选项
名称映射应该有助于涵盖更多极端情况:ClassNameTypeResolver
Class
GraphQlSource.Builder builder = ...
ClassNameTypeResolver classNameTypeResolver = new ClassNameTypeResolver();
classNameTypeResolver.setClassNameExtractor((klass) -> {
// Implement Custom ClassName Extractor here
});
builder.defaultTypeResolver(classNameTypeResolver);
GraphQlSource 部分介绍了如何使用 Spring Boot 进行配置。
指令
GraphQL 语言支持“描述备用运行时执行和 GraphQL 文档中的类型验证行为“。指令类似于 Java,但在 GraphQL 文档中的类型、字段、片段和操作上声明。
GraphQL Java 提供了帮助应用程序检测的协定
并处理指令。有关更多详细信息,请参阅
GraphQL Java 文档。SchemaDirectiveWiring
在 Spring GraphQL 中,您可以通过 RuntimeWiringConfigurer
注册一个。Boot Starter 检测到
这样的豆子,所以你可能会有这样的东西:SchemaDirectiveWiring
@Configuration
public class GraphQlConfig {
@Bean
public RuntimeWiringConfigurer runtimeWiringConfigurer() {
return builder -> builder.directiveWiring(new MySchemaDirectiveWiring());
}
}
有关指令支持的示例,请查看 Graphql Java 扩展验证库。 |
ExecutionStrategy
GraphQL Java 中的 Java 驱动请求字段的获取。
要创建 ,您需要提供 .
默认情况下,Spring for GraphQL 会创建异常处理程序,如 Exceptions 中所述,并将其设置在 .然后,GraphQL Java 使用它来创建具有配置的异常处理程序的实例。ExecutionStrategy
ExecutionStrategy
DataFetcherExceptionHandler
GraphQL.Builder
AsyncExecutionStrategy
如果需要创建自定义 ,可以检测 s 并以相同的方式创建异常处理程序,并使用
它创建自定义 .例如,在 Spring Boot 应用程序中:ExecutionStrategy
DataFetcherExceptionResolver
ExecutionStrategy
@Bean
GraphQlSourceBuilderCustomizer sourceBuilderCustomizer(
ObjectProvider<DataFetcherExceptionResolver> resolvers) {
DataFetcherExceptionHandler exceptionHandler =
DataFetcherExceptionResolver.createExceptionHandler(resolvers.stream().toList());
AsyncExecutionStrategy strategy = new CustomAsyncExecutionStrategy(exceptionHandler);
return sourceBuilder -> sourceBuilder.configureGraphQl(builder ->
builder.queryExecutionStrategy(strategy).mutationExecutionStrategy(strategy));
}
架构转换
如果要遍历,可以注册 via
并在创建架构后对其进行转换,并对架构进行更改。请记住
这通常比架构遍历更昂贵
首选遍历而不是转换,除非需要进行架构更改。graphql.schema.GraphQLTypeVisitor
builder.schemaResources(..).typeVisitorsToTransformSchema(..)
架构遍历
如果要遍历架构,可以注册 via
它已创建,并可能对 .请记住,
但是,此类访问者无法更改架构。如果需要对架构进行更改,请参阅架构转换。graphql.schema.GraphQLTypeVisitor
builder.schemaResources(..).typeVisitors(..)
GraphQLCodeRegistry
模式映射检查
如果查询、突变或订阅操作没有 ,则不会
返回任何数据,并且不会执行任何有用操作。同样,返回的架构类型上的字段
通过既不通过注册显式覆盖,也不隐式通过默认覆盖的操作,该操作查找
匹配的 Java 对象属性,将始终为 。DataFetcher
DataFetcher
PropertyDataFetcher
null
GraphQL Java 不会执行检查以确保覆盖每个模式字段,并且
可能会导致可能无法发现的差距,具体取决于测试覆盖率。在运行时
您可能会收到“静默”,或者如果该字段不可为空,则会出现错误。作为较低级别
库,GraphQL Java 对实现和
它们的返回类型,因此无法将模式类型结构与 Java 对象进行比较
结构。null
DataFetcher
Spring for GraphQL 定义了允许 a 公开返回类型信息的接口。所有 Spring 实现
实现此接口。这包括 Annotated Controller 的控制器,以及 Querydsl 和 Query by Example Spring Data 存储库的控制器。对于带注释的
控制器,则返回类型派生自方法上声明的返回类型。SelfDescribingDataFetcher
DataFetcher
DataFetcher
@SchemaMapping
在启动时,Spring for GraphQL 可以检查架构字段、注册、
以及从实现返回的 Java 对象的属性以进行检查
如果所有架构字段都由显式注册的 或
匹配的 Java 对象属性。检查还会执行反向检查,以查找不存在的架构字段的注册。DataFetcher
DataFetcher
DataFetcher
DataFetcher
要启用架构映射检查,请执行以下操作:
GraphQlSource.Builder builder = ...
builder.schemaResources(..)
.inspectSchemaMappings(report -> {
logger.debug(report);
})
下面是一个示例报告:
GraphQL schema inspection: Unmapped fields: {Book=[title], Author[firstName, lastName]} (1) Unmapped registrations: {Book.reviews=BookController#reviews[1 args]} (2) Skipped types: [BookOrAuthor] (3)
1 | 未映射的架构字段及其源类型的列表 |
2 | 不存在的字段上的注册列表DataFetcher |
3 | 跳过的架构类型列表,如下所述 |
架构现场检查可以执行的操作是有限制的,特别是当
Java 类型信息不足。如果带注释的控制器方法
声明为返回 ,或者如果返回类型具有未指定的泛型
参数,或者如果 没有实现,则返回类型甚至未知。在这种情况下,
Java 对象类型结构仍然未知,并且模式类型被列为跳过
生成的报告。对于每个跳过的类型,都会记录一条 DEBUG 消息以指示原因
它被跳过了。java.lang.Object
List<?>
DataFetcher
SelfDescribingDataFetcher
架构联合类型始终被跳过,因为控制器方法无法 在 Java 中声明这样的返回类型,并且 Java 类型结构未知。
架构接口类型仅支持直接声明的字段,即
与 声明的 Java 类型的属性进行比较。
不检查具体实现的其他字段。这是可以改进的
在将来的版本中,还要检查架构实现类型并尝试
在声明的 Java 返回类型的子类型之间查找匹配项。SelfDescribingDataFetcher
interface
操作缓存
GraphQL Java 必须在执行操作之前解析和验证操作。这可能会影响
性能显著。为了避免需要重新分析和验证,应用程序可以
配置缓存和重用文档实例的 a。GraphQL Java 文档提供了有关
通过 .PreparsedDocumentProvider
PreparsedDocumentProvider
在 Spring GraphQL 中,您可以通过以下方式注册:
.PreparsedDocumentProvider
GraphQlSource.Builder#configureGraphQl
// Typically, accessed through Spring Boot's GraphQlSourceBuilderCustomizer
GraphQlSource.Builder builder = ...
// Create provider
PreparsedDocumentProvider provider =
new ApolloPersistedQuerySupport(new InMemoryPersistedQueryCache(Collections.emptyMap()));
builder.schemaResources(..)
.configureRuntimeWiring(..)
.configureGraphQl(graphQLBuilder -> graphQLBuilder.preparsedDocumentProvider(provider))
GraphQlSource 部分介绍了如何使用 Spring Boot 进行配置。
用于跨多个类路径查找架构文件
位置,例如跨多个模块。classpath*:graphql/**/ |
GraphQL Java,服务器应用程序仅使用 Jackson 进行数据映射的序列化。 客户端输入被解析为映射。服务器输出将根据字段选择集组合成地图。 这意味着您不能依赖 Jackson 序列化/反序列化批注。 相反,您可以使用自定义标量类型。 |
有关指令支持的示例,请查看 Graphql Java 扩展验证库。 |
1 | 未映射的架构字段及其源类型的列表 |
2 | 不存在的字段上的注册列表DataFetcher |
3 | 跳过的架构类型列表,如下所述 |
螺纹模型
大多数 GraphQL 请求都受益于获取嵌套字段的并发执行。这是
为什么今天大多数应用程序都依赖于 GraphQL Java 的 ,它允许
数据获取器返回并发执行,而不是串行执行。AsyncExecutionStrategy
CompletionStage
Java 21 和虚拟线程增加了一个有效使用更多线程的重要功能,但是 仍然需要并发执行而不是串行执行才能进行请求 执行以更快地完成。
Spring for GraphQL 支持:
-
反应式数据获取器,这些是 适应了 .
CompletionStage
AsyncExecutionStrategy
-
CompletionStage
作为返回值。 -
属于 Kotlin 协程方法的控制器方法。
-
@SchemaMapping 和 @BatchMapping 方法可以返回提交到 Spring Framework 之类的方法。若要启用此功能,必须配置 on .
Callable
Executor
VirtualThreadTaskExecutor
Executor
AnnotatedControllerConfigurer
Spring for GraphQL 在 Spring MVC 或 WebFlux 上运行作为传输。Spring MVC
使用异步请求执行,除非完成结果
在 GraphQL Java 引擎返回后立即出现这种情况,如果
请求非常简单,不需要异步数据提取。CompletableFuture
反应性的DataFetcher
默认生成器启用对返回的支持,或者将这些返回器调整为聚合值的位置
并转换为 List,除非该请求是 GraphQL 订阅请求,
在这种情况下,返回值仍然是流式处理的响应式流
GraphQL 响应。GraphQlSource
DataFetcher
Mono
Flux
CompletableFuture
Flux
Publisher
反应式可以依赖于对 Reactor 上下文的访问,该上下文是从
传输层,例如来自 WebFlux 请求处理的传输层,请参阅 WebFlux 上下文。DataFetcher
上下文传播
Spring for GraphQL 支持透明地将上下文从 HTTP 传输、GraphQL Java 传播到它调用的其他组件。这包括两个上下文
来自 Spring MVC 请求处理线程和来自 WebFlux 的 Reactor
处理管道。DataFetcher
ThreadLocal
Context
网络MVC
GraphQL Java 调用的 A 和其他组件可能并不总是在
与 Spring MVC 处理程序相同的线程,例如,如果异步 WebGraphQlInterceptor
或切换到
不同的线程。DataFetcher
DataFetcher
Spring for GraphQL 支持从 Servlet 容器传播值
线程到线程 a 和 GraphQL Java 调用的其他组件
执行。为此,应用程序需要实现感兴趣的值:ThreadLocal
DataFetcher
io.micrometer.context.ThreadLocalAccessor
ThreadLocal
public class RequestAttributesAccessor implements ThreadLocalAccessor<RequestAttributes> {
@Override
public Object key() {
return RequestAttributesAccessor.class.getName();
}
@Override
public RequestAttributes getValue() {
return RequestContextHolder.getRequestAttributes();
}
@Override
public void setValue(RequestAttributes attributes) {
RequestContextHolder.setRequestAttributes(attributes);
}
@Override
public void reset() {
RequestContextHolder.resetRequestAttributes();
}
}
您可以在启动时手动注册全局实例,该实例可通过 访问。您也可以注册它
自动通过该机制。ThreadLocalAccessor
ContextRegistry
io.micrometer.context.ContextRegistry#getInstance()
java.util.ServiceLoader
网络通量
Reactive DataFetcher
可以依赖于对 Reactor 上下文的访问,该上下文
源自 WebFlux 请求处理链。这包括反应堆上下文
由 WebGraphQlInterceptor 组件添加。
异常
在 GraphQL Java 中,决定如何表示来自
在响应的“错误”部分中获取数据。应用程序可以注册
仅限单个处理程序。DataFetcherExceptionHandler
Spring for GraphQL 注册了一个提供默认值的
处理并启用合同。应用程序可以
通过 GraphQLSource
builder 注册任意数量的解析器,这些解析器位于
顺序,直到一个 他们解析为 .
Spring Boot 启动器会检测这种类型的 bean。DataFetcherExceptionHandler
DataFetcherExceptionResolver
Exception
List<graphql.GraphQLError>
DataFetcherExceptionResolverAdapter
是一个方便的基类,具有受保护的方法和 。resolveToSingleError
resolveToMultipleErrors
Annotated Controllers 编程模型支持处理数据获取异常
具有灵活方法签名的带注释的异常处理程序方法,有关详细信息,请参阅@GraphQlExceptionHandler
。
可以根据 GraphQL Java 或 Spring GraphQL 将 A 分配给一个类别,该类别定义了以下内容:GraphQLError
graphql.ErrorClassification
ErrorType
-
BAD_REQUEST
-
UNAUTHORIZED
-
FORBIDDEN
-
NOT_FOUND
-
INTERNAL_ERROR
如果异常仍未解决,则默认情况下将其归类为具有包含类别名称和 from 的通用消息的异常。该消息故意不透明以避免泄漏
实现细节。应用程序可以使用 a 来自定义
错误详细信息。INTERNAL_ERROR
executionId
DataFetchingEnvironment
DataFetcherExceptionResolver
未解决的异常与 to correlate 一起记录在 ERROR 级别
发送到客户端的错误。已解决的异常记录在 DEBUG 级别。executionId
请求例外
GraphQL Java 引擎在解析请求时可能会遇到验证或其他错误
这反过来又会阻止请求执行。在这种情况下,响应包含一个
“data”键,以及一个或多个全局的请求级“错误”,即不是
具有字段路径。null
DataFetcherExceptionResolver
无法处理此类全局错误,因为它们被引发
在执行开始之前和调用任何操作之前。应用程序可以使用
传输级拦截器,用于检查和转换 .
请参阅 WebGraphQlInterceptor
下的示例。DataFetcher
ExecutionResult
分页
GraphQL Cursor Connection 规范定义了一种导航大型结果集的方法,方法是在以下情况下返回项的子集 每个项目都与一个光标配对,客户端可以使用该光标在 或 在引用的项目之后。
该规范将该模式称为“连接”。名称以结尾的架构类型
on Connection 是表示分页结果集的 Connection Type。所有类型都包含一个“edges”字段,其中类型将实际项目与光标配对,如
以及带有布尔标志的“pageInfo”字段,用于指示是否有更多项目转发
和落后。~Connection
~Edge
连接类型
Connection
必须为需要分页的每个类型创建类型定义,并添加
架构的样板和噪声。Spring for GraphQL 提供在启动时添加这些类型(如果尚未添加)
存在于解析的架构文件中。这意味着在架构中,您只需要以下内容:ConnectionTypeDefinitionConfigurer
Query {
books(first:Int, after:String, last:Int, before:String): BookConnection
}
type Book {
id: ID!
title: String!
}
请注意规范定义的前向分页参数,客户端可以使用这些参数
请求给定光标后的前 N 项,而 和 是向后的
分页参数,用于请求给定游标之前的最后 N 项。first
after
last
before
接下来,按如下方式进行配置:ConnectionTypeDefinitionConfigurer
GraphQlSource.schemaResourceBuilder()
.schemaResources(..)
.typeDefinitionConfigurer(new ConnectionTypeDefinitionConfigurer)
以下类型定义将透明地添加到架构中:
type BookConnection {
edges: [BookEdge]!
pageInfo: PageInfo!
}
type BookEdge {
node: Book!
cursor: String!
}
type PageInfo {
hasPreviousPage: Boolean!
hasNextPage: Boolean!
startCursor: String
endCursor: String
}
默认情况下,Boot Starter 会注册。ConnectionTypeDefinitionConfigurer
ConnectionAdapter
一旦连接类型在架构中可用,您还需要
等效的 Java 类型。GraphQL Java 提供了这些功能,包括泛型 和 ,以及 .Connection
Edge
PageInfo
一种选择是填充 a 并从控制器方法返回它,或者 .但是,这需要样板代码来创建 ,
创建游标,将每个项包装为 ,并创建 .
此外,您可能已经拥有底层分页机制,例如在使用
Spring 数据存储库。Connection
DataFetcher
Connection
Edge
PageInfo
Spring for GraphQL 定义了适应项目容器的协定
自。适配器通过装饰器应用,而装饰器又是
通过 .您可以按如下方式进行配置:ConnectionAdapter
Connection
DataFetcher
ConnectionFieldTypeVisitor
ConnectionAdapter adapter = ... ;
GraphQLTypeVisitor visitor = ConnectionFieldTypeVisitor.create(List.of(adapter)) (1)
GraphQlSource.schemaResourceBuilder()
.schemaResources(..)
.typeDefinitionConfigurer(..)
.typeVisitors(List.of(visitor)) (2)
1 | 创建具有一个或多个 s 的类型访客。ConnectionAdapter |
2 | 抵抗类型访客。 |
Spring Data 和 .您还可以创建自己的自定义适配器。 实现依赖于 CursorStrategy
来
为返回的项目创建游标。相同的策略也用于支持子范围
控制器方法参数,该参数包含
分页输入。ConnectionAdapter
Window
Slice
ConnectionAdapter
CursorStrategy
CursorStrategy
是编码和解码 String 游标的协定,该游标引用
项在大型结果集中的位置。光标可以基于索引或
在键集上。
ConnectionAdapter
使用它对返回项的游标进行编码。Annotated Controllers 方法、Querydsl 存储库和 Query by Example 存储库使用它来解码分页请求中的游标,并创建一个 .Subrange
CursorEncoder
是一个相关的合约,它进一步编码和解码 String 游标
使它们对客户不透明。 与 .您可以使用 ,也可以创建自己的。EncodingCursorStrategy
CursorStrategy
CursorEncoder
Base64CursorEncoder
NoOpEncoder
有一个内置的 Spring Data .当 Spring Data 存在时,Boot Starter 会注册 a。CursorStrategy
ScrollPosition
CursorStrategy<ScrollPosition>
Base64Encoder
1 | 创建具有一个或多个 s 的类型访客。ConnectionAdapter |
2 | 抵抗类型访客。 |
批量加载
给定 a 和 its ,我们可以为一本书创建一个,另一个
对于它的作者。这允许选择有或没有作者的书籍,但这意味着书籍
而且作者没有加载在一起,这在查询多个作者时效率尤其低下
书籍作为每本书的作者是单独加载的。这称为 N+1 选择
问题。Book
Author
DataFetcher
DataLoader
GraphQL Java 提供了一种批量加载相关实体的机制。
您可以在 GraphQL Java 文档中找到完整的详细信息。下面是一个
工作原理摘要:DataLoader
-
在给定唯一键的情况下,在可以加载实体的 中注册 的。
DataLoader
DataLoaderRegistry
-
DataFetcher
可以访问 ,并使用它们按 id 加载实体。DataLoader
-
A 通过返回 future 来延迟加载,以便可以批量完成。
DataLoader
-
DataLoader
维护每个请求的已加载实体缓存,可以进一步 提高效率。
BatchLoaderRegistry
GraphQL Java 中的完整批处理加载机制需要实现以下之一
几个接口,然后将它们包装并注册为 S
名称在 .BatchLoader
DataLoader
DataLoaderRegistry
Spring GraphQL 中的 API 略有不同。对于注册,只有一个,
集中公开工厂方法和构建器来创建和
注册任意数量的批量加载函数:BatchLoaderRegistry
@Configuration
public class MyConfig {
public MyConfig(BatchLoaderRegistry registry) {
registry.forTypePair(Long.class, Author.class).registerMappedBatchLoader((authorIds, env) -> {
// return Mono<Map<Long, Author>
});
// more registrations ...
}
}
Boot Starter 声明一个可以注入的 Bean
您的配置,如上所示,或按顺序放入任何组件(如控制器)
注册批量加载函数。反过来,它被注入到它确保每个请求注册的地方。BatchLoaderRegistry
BatchLoaderRegistry
DefaultExecutionGraphQlService
DataLoader
默认情况下,该名称基于目标实体的类名。
这允许方法使用泛型类型声明 DataLoader 参数,并且
无需指定名称。但是,如有必要,可以通过构建器自定义该名称以及其他 .DataLoader
@SchemaMapping
BatchLoaderRegistry
DataLoaderOptions
全局配置默认值,用作任何
注册,您可以覆盖 Boot 的 bean 并使用构造函数
因为那接受.DataLoaderOptions
BatchLoaderRegistry
DefaultBatchLoaderRegistry
Supplier<DataLoaderOptions>
在许多情况下,在加载相关实体时,可以使用@BatchMapping控制器方法,这是一种快捷方式
用于和替换需要直接使用。BatchLoaderRegistry
DataLoader
BatchLoaderRegistry
还提供其他重要好处。它支持访问
从批处理加载函数和从方法,
以及确保向他们传播上下文。这就是需要申请的原因
使用它。可以直接执行自己的注册,但
此类注册将放弃上述好处。GraphQLContext
@BatchMapping
DataLoader
测试批处理加载
首先在以下方面执行注册:BatchLoaderRegistry
DataLoaderRegistry
BatchLoaderRegistry batchLoaderRegistry = new DefaultBatchLoaderRegistry();
// perform registrations...
DataLoaderRegistry dataLoaderRegistry = DataLoaderRegistry.newRegistry().build();
batchLoaderRegistry.registerDataLoaders(dataLoaderRegistry, graphQLContext);
现在,您可以按如下方式访问和测试个人:DataLoader
DataLoader<Long, Book> loader = dataLoaderRegistry.getDataLoader(Book.class.getName());
loader.load(1L);
loader.loadMany(Arrays.asList(2L, 3L));
List<Book> books = loader.dispatchAndJoin(); // actual loading
assertThat(books).hasSize(3);
assertThat(books.get(0).getName()).isEqualTo("...");
// ...