首页 > 解决方案 > SpringBoot GraphQL 字段名不匹配

问题描述

似乎.graphqls文件中定义的名称必须与 POJO 中的字段名称匹配。有没有办法可以注释该字段,以便他们不必这样做?

例如,我在 graphqls 文件中有这样的东西

type Person {
     personId: ID!
     name: String!
}

然后在我的Entity POJO中我喜欢

@Id
@Column(name="PERSON_ID")
@JsonProperty("person_id")
private int personId;

@Column(name="NAME")
@JsonProperty("name")
private String name;

因此,目的是让字段名称personId和数据库将其存储为名为的列PERSON_ID,并将其序列化为 JSON 和 GraphQLperson_id

但是 graphql 用模式的语言来说话。所以它将它序列化为personId与模式字段匹配但不是意图的。我可以将模式更改为,person_id但是我也需要更改字段...这不是世界末日,但是以这种方式命名字段是非常“不像 java”的。

我正在使用这个库:

compile group: 'com.graphql-java', name: 'graphql-spring-boot-starter', version: '5.0.2'

我还在@GraphQLName注释库中看到了注释,但我一定遗漏了一些东西,因为它没有达到我的预期,或者我使用错误。

有什么办法可以解决这个问题还是我应该只更改名称?

标签: spring-bootgraphqlgraphql-java

解决方案


GraphQL JavaPropertyDataFetcher默认使用解析字段值(请参阅文档中的数据获取部分)。当顶级字段数据提取器返回的数据对象包含与数据对象属性名称匹配的子字段时,此数据提取器开箱即用。

但是,您可以为任何字段定义自己的数据提取器并使用您需要的任何规则。

所以,如果你想要一个看起来像这样的模式

type Person {
     person_id: ID!
     name: String!
}

你的实体是这样的:

class Person {
    private int personId;

    private String name;

    // getters and setters
}

您可以为该字段编写一个简单的自定义数据获取器personId

private RuntimeWiring buildWiring() {
    return RuntimeWiring.newRuntimeWiring()
            // query root data fetchers wiring
            .type(newTypeWiring("Person")
                    .dataFetcher("person_id", environment -> {
                        Person person = environment.getSource();
                        return person.getPersonId();
                    })
            )
            // maybe other wirings
            .build();
}

推荐阅读