首页 文章

SpringBoot GraphQL字段名称不匹配

提问于
浏览
0

似乎 .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 ,但之后我还需要更改字段...这不是't the end of the world but it',而是以相应的方式命名字段 .

我正在使用这个库:

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

我也在注释库中看到了 @GraphQLName 注释,但我必须遗漏一些东西,因为它没有做我期望的事情,或者我使用它错了 .

有没有办法解决这个问题,还是我应该更改名称?

1 回答

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

相关问题