在 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);

一个小的区别是,在某些更高版本的 , you do not need to explicitly configure DataLoaderDispatcherInstrumentation for the GraphQL like this中,如果没有配置它会自动激活。相反,只需确保为 ExecutionInput 配置与 Context 相同的 dataLoaderRegistry,因为 DataLoaderDispatcherInstrumentation 需要从中访问 DataLoaderRegistry