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

时间:2017-05-24 13:26:17

标签: java graphql graphql-java

我希望使用其他对象类型将字段值传递给已解析的字段。

如果我有'Customer>用户>简介' - 为了正确解析,我如何将Customer中的CustomerID字段值作为参数或变量传递给Profile?

1 个答案:

答案 0 :(得分:3)

正好有4种可能性(如graphql-java v11,第5版将在graphql-java v12中出现)在任何级别向解析器(DataFetcher)提供信息:

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

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

2)从对象获取值

source 是封闭查询的结果。 在您的情况下,customer查询的来源是根上下文(无论您在查询执行时提供什么,例如graphQL.execute(query, rootContext))。
user查询的来源是返回的customer个查询,可能是Customer个实例。
profile查询的来源是user查询返回的任何内容,可能是User个实例。 您可以通过DataFetchingEnvironment#getSource()获取来源。因此,如果User包含您之后的CustomerID,请通过((User) env.getSource()).getCustomerId()获取。如果没有,请考虑将结果包装到一个对象中,该对象将包含子查询中所需的所有内容。

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

例如,您可以使用ConcurrentHashMap作为上下文:

ExecutionInput input = ExecutionInput.newExecutionInput()
  .query(operation)
  .context(new ConcurrentHashMap<String, Object>())
  .build()
graphQL.execute(query, input);

然后,在DataFetcher的{​​{1}}内,您将customer存储到其中:

CustomerID

稍后,在Customer customer = getCustomer(); Map<String, Object> context = env.getContext(); context.put("CustomerID", customer.getId()); DataFetcher内,你可以从上下文中获取它:

profile

而不是Map<String, Object> context = env.getContext(); context.get("CustomerID"); ,您可能正在使用类型化对象,但您必须确保字段为ConcurrentHashMap或getters / setters volatile或其他线程安全

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

4)直接获取传递给父字段的参数(从graphql-java v11开始)

synchronized

5)使用 local 上下文传递值(从graphql-java v12开始)

不是直接返回结果,而是将其包装成ExecutionStepInfo stepInfo = dataFetchingEnvironment.getExecutionStepInfo(); stepInfo.getParent().getArguments(); // get the parent arguments 。这样,您还可以将任何对象作为DataFetcherResult附加,以便localContext

向所有子DataFetcher提供