gpt4 book ai didi

Java GraphQL - 将字段值传递给对象的解析器

转载 作者:行者123 更新时间:2023-12-02 12:35:50 27 4
gpt4 key购买 nike

我希望使用另一种对象类型将字段值传递到已解析字段。

另一种说法,如果我有“客户 > 用户 > 配置文件” - 如何将客户中的 CustomerID 字段值作为参数或变量传递给配置文件,以便正确解析?

最佳答案

有 5 种可能性(从 graphql-java v12 开始)向任意级别的解析器 (DataFetcher) 提供信息:

1) 直接在查询中传递它们(可能在多个级别上):

{customer(id: 3) {
user {
profile(id: 3) {
name
}
}
}
}

2) 从对象获取值

是封闭查询的结果。在您的情况下,customer 查询的源是根(无论您在查询执行时提供什么,例如

graphQL.execute(ExecutionInput.newExecutionInput()
.query(query)
.root(root)
.build())

user 查询的来源是返回的 customer 查询,大概是某个 Customer 实例。
profile 查询的来源是 user 查询返回的任何内容,大概是一个 User 实例。您可以通过 DataFetchingEnvironment#getSource() 获取源代码。因此,如果 User 包含您想要的 CustomerID,只需通过 ((User) env.getSource()).getCustomerId() 获取它>。如果没有,请考虑将结果包装到一个对象中,该对象将包含子查询中所需的所有内容。

3)使用共享上下文传递值

graphql-java 传递可供所有解析器使用的 GraphQLContext 实例。因此,在 customerDataFetcher 内,您可以将 CustomerID 存储到其中:

Customer customer = getCustomer();
GraphQLContext context = env.getContext();
context.put("CustomerID", customer.getId());

稍后,在 profileDataFetcher 内,您可以从上下文中获取它:

String customerId = env.getContext().get("CustomerID");

要初始化上下文,请在执行查询时传递它:

ExecutionInput input = ExecutionInput.newExecutionInput()
.query(operation)
.graphQLContext(new HashMap<>())
.build()
graphQL.execute(query, input);

这种方式是有状态的,因此最难管理,因此只有在其他方法都失败时才使用它。

4) 直接获取传递给父字段的参数

ExecutionStepInfo stepInfo = dataFetchingEnvironment.getExecutionStepInfo();
stepInfo.getParent().getArguments(); // get the parent arguments

5) 使用本地上下文传递值

不要直接返回结果,而是将其包装到 DataFetcherResult 中。这样,您还可以将任何对象附加为 localContext,所有子 DataFetcher 都可以通过 DataFetchingEnvironment#getLocalContext()

使用该对象>

关于Java GraphQL - 将字段值传递给对象的解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44159753/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com