1

我正在创建一个带有 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
}
4

2 回答 2

0

在 spring 中,所有的变量都喜欢在 jsonisSomething中替换为。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
)

我不确定为什么会这样。我会寻找答案并在找到时编辑帖子。

于 2019-12-16T23:26:15.677 回答
0

默认情况下,所有 JavaBean 属性都由它们的属性名称命名,而不是它们的访问器名称。所以getSomething将被映射为something并且isAdmin(返回 a boolean)将被映射为admin. 这符合大多数框架/语言/序列化格式的行为。在映射到 JSON、通过 SpEL 访问字段、映射到数据库列名等时,您将获得相同的默认行为。

要逐个覆盖名称,请添加@GraphQLQuery到字段(影响输入和输出类型)或访问器/获取器(仅影响输出类型)。要影响输入类型,只需添加@GraphQLInputField字段或 mutator/setter。@JsonProperty输入类型也受到尊重,并且可以选择为输出配置。

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

于 2019-12-17T19:41:57.777 回答