在 GraphQL 中创建按请求数据加载器 Java
Create Per Request Data Loaders in GraphQL Java
我正在使用 GraphQL 创建一个查询某些端点的 API。现在 DataLoader 的设置方式,缓存中的值在多个 Web 请求中保持不变。正如 docs 中所建议的那样,我想更改它,以便 DataLoaders 按请求限定范围 - 即来自一个请求的缓存数据对另一个请求不可见。文档没有明确给出有关如何执行此操作的示例。
我看到这个 link:https://github.com/graphql-java/java-dataloader/issues/19
..我想知道这是否仍然是 correct/only 的方式?或者还有其他方法吗?
谢谢。
还是老样子
要处理 GraphQL 请求,您必须创建一个新的 ExecutionInput
实例并为每个请求配置其设置。它的设置之一是 Context
对象(它是通用的 Object
类型,因此您可以自由定义自己的类型)。只需确保此 Context
对象包含 DataLoaderRegistry
并确保您使用 DataLoaderRegistry
的新实例创建 Context
的新实例,该新实例注册 [=] 的新实例18=] 到它。
代码明智,看起来像:
public class MyContext {
private DataLoaderRegistry dataLoaderRegistry;
public MyContext(DataLoaderRegistry dataLoaderRegistry){
this.dataLoaderRegistry = dataLoaderRegistry;
}
}
//Process a GraphQL request
DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry();
dataLoaderRegistry.register("fooDataLoder" , DataLoader.newDataLoader("......."));
MyContext context = new MyContext(dataLoaderRegistry);
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query("employees {id name department}")
.context(context)
.dataLoaderRegistry(context.getDataLoaderRegistry())
.build();
GraphQL graphQL = GraphQL.newGraphQL(schema).build();
ExecutionResult executionResult = graphQL.execute(executionInput);
一个小的区别是,在某些更高版本的graphql-java , you do not need to explicitly configure DataLoaderDispatcherInstrumentation
for the GraphQL
like this中,如果没有配置它会自动激活。相反,只需确保为 ExecutionInput
配置与 Context
相同的 dataLoaderRegistry
,因为 DataLoaderDispatcherInstrumentation
需要从中访问 DataLoaderRegistry
。
我正在使用 GraphQL 创建一个查询某些端点的 API。现在 DataLoader 的设置方式,缓存中的值在多个 Web 请求中保持不变。正如 docs 中所建议的那样,我想更改它,以便 DataLoaders 按请求限定范围 - 即来自一个请求的缓存数据对另一个请求不可见。文档没有明确给出有关如何执行此操作的示例。
我看到这个 link:https://github.com/graphql-java/java-dataloader/issues/19 ..我想知道这是否仍然是 correct/only 的方式?或者还有其他方法吗?
谢谢。
还是老样子
要处理 GraphQL 请求,您必须创建一个新的 ExecutionInput
实例并为每个请求配置其设置。它的设置之一是 Context
对象(它是通用的 Object
类型,因此您可以自由定义自己的类型)。只需确保此 Context
对象包含 DataLoaderRegistry
并确保您使用 DataLoaderRegistry
的新实例创建 Context
的新实例,该新实例注册 [=] 的新实例18=] 到它。
代码明智,看起来像:
public class MyContext {
private DataLoaderRegistry dataLoaderRegistry;
public MyContext(DataLoaderRegistry dataLoaderRegistry){
this.dataLoaderRegistry = dataLoaderRegistry;
}
}
//Process a GraphQL request
DataLoaderRegistry dataLoaderRegistry = new DataLoaderRegistry();
dataLoaderRegistry.register("fooDataLoder" , DataLoader.newDataLoader("......."));
MyContext context = new MyContext(dataLoaderRegistry);
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query("employees {id name department}")
.context(context)
.dataLoaderRegistry(context.getDataLoaderRegistry())
.build();
GraphQL graphQL = GraphQL.newGraphQL(schema).build();
ExecutionResult executionResult = graphQL.execute(executionInput);
一个小的区别是,在某些更高版本的graphql-java , you do not need to explicitly configure DataLoaderDispatcherInstrumentation
for the GraphQL
like this中,如果没有配置它会自动激活。相反,只需确保为 ExecutionInput
配置与 Context
相同的 dataLoaderRegistry
,因为 DataLoaderDispatcherInstrumentation
需要从中访问 DataLoaderRegistry
。