如何以编程方式定义尚未在 GraphQL-Java 中完全定义的类型的字段?

How to programmatically define a field of type yet-to-be fully defined in GraphQL-Java?

我正在“玩”graphql-java 和相关的 kickstarter servlet,修改它以根据我自动发现的类型以编程方式构建模式。该文档(几乎)在那里,但在某些地方已经过时并且引用了已弃用的方法。我的特殊问题是 GraphQLFieldDefinition.Builder 有四种 type(...) 方法的变体 - 三种接受各种(其他)构建器,一种接受我可能拥有的 GraphQLOutputType, none .此外,那些接受构建器的构建器实际上会在这些构建器上调用 build() 方法,因此我也急于传递任何“未完成”类型的构建器。我想预先定义所有类型,根本没有字段,然后再向它们添加字段,但是如果 build() 在那个时间点被调用,即使它们今天没有进入不需要的状态我可以看到未来的更新如何最多需要一次 build() 调用。

所以问题是如何将字段声明为尚未定义或未完全定义的类型?例如,Employeemanager 字段本身就是 Employee 类型,例如:

type Employee {
   name: String!
   manager: Employee
   reports: [Employee!]
   buddy: Employee
   ...
}

正如我在评论中指出的那样,与其尝试(直接)使用构建器或构建类型,不如创建一个 GraphQLTypeReference 的实例,而不是像这样:

GraphQLTypeReference.typeRef(typeName)

这将在构建架构时自动解决。

如果我们想要表明这不是可空的,即使引用的类型是可空的,我们还需要像这样包装到一个 GraphQLNonNull 包装器中:

GraphQLNonNull.nonNull(typeRef)

...并将其用作类型。