在 Return 上将 JsonObject 解构为 GraphQL 类型

Destructure a JsonObject to a GraphQL Type on Return

Vertx 是 json 成为第一个 class 公民的忠实粉丝,我也是它的忠实粉丝。我将 jsonb 列存储在 postgres 中作为我的主要数据存储机制。有点像这样:

CREATE TABLE game (
    id varchar(16) not null default next_id() primary key,
    data jsonb not null
);

然后我检索数据,处理 json 对象,然后 return 将其发送到浏览器。效果很好。

不过,我也在尝试使用 GraphQL,但似乎无法将 json 对象转换为 graphql 类型。例如我将此数据存储在数据库中:

{"name": "dominion", "createdBy": "Donald X. Vaccarino", "id": 233}

这是 graphql 类型:

type Game {
    id: Long,
    name: String,
    createdBy: String,
    createdAt: DateTime,
    deletedAt: DateTime
}

并且这个 graphql 查询 return 是一个空项目列表,因为 json 数组中的 json 对象(游戏)没有被分解到 Game类型:

type Query {
    allGames(secureOnly: Boolean = false): [Game]
}

但如果我使用 json 作为查询结果类型,游戏列表会显示:

type Query {
    allGames(secureOnly: Boolean = false): [JSON]
}

不过,问题在于 graphql 模式中现在没有类型信息。无法让客户端知道 JSON 对象

中有哪些属性

我的数据获取器有这种类型:

DataFetcher[CompletionStage[JsonArray]]

关于如何在代码中 return json 并让 graphql 响应 return 游戏类型有什么想法吗?

默认的 GraphQL 数据获取器是 PropertyDataFetcher

如果你想支持 Vert.x JsonObjectJsonArray,你必须配置 GraphQL-Java 来使用 VertxPropertyDataFetcher:

RuntimeWiring.Builder builder = RuntimeWiring.newRuntimeWiring();
builder.wiringFactory(new WiringFactory() {
  @Override
  public DataFetcher<Object> getDefaultDataFetcher(FieldWiringEnvironment environment) {
    return VertxPropertyDataFetcher.create(environment.getFieldDefinition().getName());
  }
});