我希望使用其他对象类型将字段值传递给已解析的字段。
如果我有'Customer>用户>简介' - 为了正确解析,我如何将Customer中的CustomerID字段值作为参数或变量传递给Profile?
答案 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
提供