提问者:小点点

SpringBoot GraphQL字段名称不匹配


似乎. graph qls文件中定义的名称必须与POJO中的字段名称匹配。有没有办法注释字段,这样他们就不必这样做了?

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

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;

因此,目的是让字段名为人员ID,数据库将其存储为名为的列PERSON_ID,并将其序列化为JSON,将GraphQL序列化为person_id

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

我正在使用这个库:

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

我还在注解库中看到了@GraphQLName注解,但我一定遗漏了什么,因为它没有达到我的预期,或者可能我用错了。

有什么办法可以解决这个问题吗?还是我应该换个名字?


共1个答案

匿名用户

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

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

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

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

和你的实体像这样:

class Person {
    private int personId;

    private String name;

    // getters and setters
}

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

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