spring-boot - 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
注释库中看到了注释,但我一定遗漏了一些东西,因为它没有达到我的预期,或者我使用错误。
有什么办法可以解决这个问题还是我应该只更改名称?
解决方案
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();
}
推荐阅读
- anylogic - 为同一资源池中的各个单元定义不同的延迟时间
- c++ - c++17 中 std::destroy_at() 的用法?
- python - 使用 bash 脚本从标准输入读取文件并将读取的行传递给 python 脚本的最佳方法是什么
- c++ - 什么时候需要默认构造函数?
- android - 使用 OpenGL ES 2.0 在 Android 中更改 3D 对象的颜色
- r - 使用 R 从字符串向量中搜索列
- php - php - 多个复选框将检查数据何时加载有效值
- sql - 在 SQL 中,在两个表中查找空值的最佳方法是什么,其中值应包含数据
- javascript - 匹配模式的javascript正则表达式(有冲突)
- java - amazon rekognition中人脸匹配SearchFacesByImage成功后获取个人信息