0

拥有 GraphQL 架构:

type TypeA {
   id: ID,
   name: String,
   other: TypeC
}

type TypeB {
   id: ID,
   name: String,
   other: TypeC
}

我应该如何独立于源对象类型实现 TypeC 接线?我知道我可以做到:

RuntimeWiring.newRuntimeWiring()
  .type(TypeRuntimeWiring.newTypeWiring("TypeA")
    .dataFetcher("other", dataFetcher_typeC.get())
  .type(TypeRuntimeWiring.newTypeWiring("TypeB")
    .dataFetcher("other", dataFetcher_typeC.get())
  .build()

但随后数据获取器依赖于源对象类型:

DataFetcher<CompletableFuture<Collection<TypeC>>> get() {
  return dataFetchingEnvironment -> {
    <??> sourceObj = dataFetchingEnvironment.getSource();
    return getObject(sourceObj.someProperty);
  };
}

鉴于 POJO(TypeA 和 TypeB)都具有对 TypeC 的引用字段,如何通过给定的引用而不是源对象来解析 TypeC 字段?

4

2 回答 2

0

这里的文档

dataFetchingEnvironment 提供 getExecutionStepInfo() 方法,该方法返回 ExecutionStepInfo 对象。从那里,您可以获取家长信息。

ExecutionStepInfo executionStepInfo = environment.getExecutionStepInfo();
ExecutionStepInfo parentInfo = executionStepInfo.getParent();
GraphQLObjectType parentType = (GraphQLObjectType) parentInfo.getUnwrappedNonNullType();

// parentType.getName() returns you "TypeA" or "TypeB"
于 2020-04-24T10:52:13.473 回答
0

我实际上已经找到了两种可能的解决方案:

  1. 定义新接线时,获取源对象并从中获取字段。使用参数调用 dataFetcher 方法,如常规 java 方法:
  2. 内部数据提取器从 DataFetcherEnvironment 获取字段名称。使用反射从源对象获取字段

示例 #1:

RuntimeWiring.newRuntimeWiring()
  .type(TypeRuntimeWiring.newTypeWiring("TypeA")
    .dataFetcher("other", environment -> {
        TypeA sourceObj = environment.getSource();
        return dataFetcher_typeC.get(sourceObj.other)})
  .type(TypeRuntimeWiring.newTypeWiring("TypeB")
        TypeB sourceObj = environment.getSource();
        return dataFetcher_typeC.get(sourceObj.other)})
  .build()

示例 #2:

DataFetcher<CompletableFuture<Collection<TypeC>>> get() {
  return dataFetchingEnvironment -> {
    Field  declaredField = dataFetchingEnvironment.getSource().getClass()
                  .getDeclaredField(dataFetchingEnvironment.getField().getName());
    declaredField.setAccessible(true);

    String value = (String) declaredField.get(dataFetchingEnvironment.getSource());
    return getObject(sourceObj.someProperty);
  };
}

第二个选项看起来更好,但仍然不确定这是否是正确的方法。

于 2020-04-04T19:27:32.207 回答