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

Java GraphQL-将字段值传递给对象的解析器,java,graphql,graphql-java,Java,Graphql,Graphql Java,我希望使用另一种对象类型将字段值传递给已解析的字段 如果我有'Customer>User>Profile',另一种说法是如何将Customer中的CustomerID字段值作为参数或变量传递给Profile,以便正确解析?在任何级别上向解析程序(DataFetcher)提供信息的方法有5种(从graphql java v12开始): 1)直接在查询中传递它们(可能在多个级别上): {customer(id: 3) { user { profile(id: 3) {

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


如果我有'Customer>User>Profile',另一种说法是如何将Customer中的CustomerID字段值作为参数或变量传递给Profile,以便正确解析?

在任何级别上向解析程序(
DataFetcher
)提供信息的方法有5种(从graphql java v12开始):

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
实例。 您可以通过代码>数据DATAFETCHION环境(CustomerID)<代码>获得源代码的保存。因此,如果<代码>用户<代码>包含<代码> < <代码> >,只需通过<代码>((用户)Env.GeSoCube())获得.GuestCuuleID()/Case>。如果没有,请考虑将结果封装到包含子查询所需的所有对象中。

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

如果您自己不提供自定义上下文,GraphQLJava将为您提供一个
GraphQLContext
的实例。因此,在
customer
DataFetcher
中,您可以将
CustomerID
存储到其中:

Customer customer = getCustomer();
GraphQLContext context = env.getContext();
context.put("CustomerID", customer.getId());
稍后,在
profile
DataFetcher
中,您可以从上下文中获取它:

GraphQLContext context = env.getContext();
context.get("CustomerID");
要提供自定义上下文,请在执行查询时传递它:

ExecutionInput input = ExecutionInput.newExecutionInput()
  .query(operation)
  .context(new ConcurrentHashMap<String, Object>())
  .build()
graphQL.execute(query, input);
5)使用本地上下文传递值(可能从graphql java v12开始)


不要直接返回结果,而是将其包装成一个
DataFetcherResult
。通过这种方式,您还可以将任何对象附加为
localContext
,该对象将通过
DataFetchingEnvironment\getLocalContext()

提供给所有子
DataFetcher
s。没有任何代码或其他有关您所使用内容的信息。我没有使用任何用于Java的GraphQL库,所以YMMV,但通常会将此信息附加到为每个分辨率点返回的值中。当你从
客户那里得到
用户
时,它应该携带
客户的一些(或全部)数据
,同样也会携带到
配置文件
,所以(天真地)你可能会做一些
((Profile)resolveparms.getSource()).getUser().getCustomer().getId()
ExecutionStepInfo stepInfo = dataFetchingEnvironment.getExecutionStepInfo();
stepInfo.getParent().getArguments(); // get the parent arguments