我正在使用GraphQL接口创建Kotlin Spring-Boot api。通过GraphQL访问我的实体之一时遇到问题。您可以在下面完成我用于访问用户对象的大部分设置。
问题出在GraphQL中生成的字段,与我在实体中定义的不匹配。这仅在字段isAdmin
(以及样式相似的字段)上发生。输出更改为admin
,我无法以isAdmin
的身份访问它。如果我将字段命名为inAdmin
,letAdmin
甚至admin
,就不会发生这种情况。这是一个非常模糊的问题,我似乎找不到任何文档。
@Entity
@Table(name = "User")
class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
var id: Long,
@Column(name = "user_type")
var type: String,
@Column(name = "is_admin")
var isAdmin: Boolean
)
用于返回所有用户的解析器实现
@GraphQLApi
@Component
class UserResolver {
@Autowired
lateinit var userService: userServiceInterface
@GraphQLQuery()
fun getUsers(): List<UserType> {
return userService.getUsers()
}
}
用于存储自定义查询的服务接口
interface userServiceInterface {
fun getUsers(): List<User>
}
GraphQL gui输出架构
user{
id
type
admin //<-- invalid, expecting isAdmin
}
编辑:一种解决方法是使用别名
user{
id
type
isAdmin: admin
}
答案 0 :(得分:0)
在春季,所有isSomething
之类的变量在json中都被something
替换。
要使其明确,可以使用@JsonProperty
批注
您的课程将会
@Entity
@Table(name = "User")
class User(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
var id: Long,
@Column(name = "user_type")
var type: String,
@JsonProperty("isAdmin")
@Column(name = "is_admin")
var isAdmin: Boolean
)
我不确定为什么会这样。找到答案后,我会寻找答案。
答案 1 :(得分:0)
默认情况下,所有JavaBean属性均以其属性名称而不是其访问者名称命名。因此,getSomething
将被映射为something
,而isAdmin
(将返回boolean
)将被映射为admin
。这符合大多数框架/语言/序列化格式的行为。映射到JSON,通过SpEL访问字段,映射到数据库列名称等时,您将获得相同的默认行为。
要视情况改写名称,请将@GraphQLQuery
添加到字段(影响输入和输出类型)或访问器/获取器(仅影响输出类型)。要影响输入类型,只需在字段或增幅器/设置器上添加@GraphQLInputField
。 @JsonProperty
也适用于输入类型,可以选择将其配置为输出。
您还可以全局配置命名策略。稍后将发布示例。