生成的字段与我在实体中定义的内容不匹配

时间:2019-12-16 22:53:38

标签: spring-boot kotlin graphql-spqr

我正在使用GraphQL接口创建Kotlin Spring-Boot api。通过GraphQL访问我的实体之一时遇到问题。您可以在下面完成我用于访问用户对象的大部分设置。

问题出在GraphQL中生成的字段,与我在实体中定义的不匹配。这仅在字段isAdmin(以及样式相似的字段)上发生。输出更改为admin,我无法以isAdmin的身份访问它。如果我将字段命名为inAdminletAdmin甚至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
}

2 个答案:

答案 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也适用于输入类型,可以选择将其配置为输出。

您还可以全局配置命名策略。稍后将发布示例。