【问题标题】:Generated fields aren't matching what I have defined in my entity生成的字段与我在实体中定义的不匹配
【发布时间】:2020-04-09 10:22:54
【问题描述】:

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

【问题讨论】:

    标签: spring-boot kotlin graphql-spqr


    【解决方案1】:

    在春季,所有像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
    )
    

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

    【讨论】:

    • 我在做一些研究的时候确实是通过这种方法来的,但它似乎并没有影响序列化。我什至尝试过 GSON 的 @SerializedName(),但它也不起作用。
    【解决方案2】:

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

    要根据具体情况覆盖名称,请将@GraphQLQuery 添加到字段(影响输入和输出类型)或访问器/获取器(仅影响输出类型)。要影响输入类型,只需在字段或 mutator/setter 上添加 @GraphQLInputField@JsonProperty 也适用于输入类型,并且可以选择配置为输出。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多