SpringBoot GraphQL字段名称不匹配

时间:2018-08-02 13:14:20

标签: spring-boot graphql graphql-java

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

例如,在graphqls文件中有类似的内容

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

然后在我喜欢的实体POJO中

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

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

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

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

我正在使用该库:

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

我在注解库中也看到了@GraphQLName注解,但是我一定错过了一些东西,因为它没有达到我的期望,或者我使用的是错误的。

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

1 个答案:

答案 0 :(得分:0)

GraphQL Java默认情况下使用PropertyDataFetcher来解析字段值(请参见data fetching section in the docs)。当顶级字段数据获取程序返回的数据对象包含与数据对象属性名称匹配的子字段时,此数据获取程序可以立即使用。

但是,您可以为任何字段定义自己的数据获取程序,并使用所需的任何规则。

因此,如果您想要一个看起来像这样的架构

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();
}