【问题标题】:Jackson read only collections杰克逊只读收藏
【发布时间】:2018-02-01 00:33:51
【问题描述】:

我有一个 Spring Boot 项目,它有一个类似这样的实体的 post 端点:

class Task{
    @JoinTable(name = "task_user",
        joinColumns = arrayOf(JoinColumn(name = "task_id")),
        inverseJoinColumns = arrayOf(JoinColumn(name = "user_id")))
@ManyToMany
var users: MutableSet<User> = HashSet()
}

我不希望人们能够向用户发布任务,但 @JsonProperty(access = READ_ONLY) 似乎不适用于集合,所以如果我提供存在的 id,它们会附加到任务无论如何,有没有人知道这是否可以以类似的方式为集合完成(我知道可以使用自定义反序列化器来完成)?

【问题讨论】:

  • 您应该避免对 API 和持久层使用相同的对象。尝试仅使用必填字段创建一个像 TaskRequest 这样的新对象,然后将其映射到 Task 对象以保持实体。
  • 是的,这更有意义,我不知道为什么我没有考虑这一点,在以前的非 Kotlin 项目中已经这样做了。我仍然想知道如何不序列化集合,似乎应该有一种简单的方法来做到这一点。
  • 企业应用程序由不同的层组成是有原因的,这就是所谓的“责任分离”。如果您在控制器中使用Entity,您也可以将HttpServletRequest 发送到DAO。你可以花很多时间来解决这个问题,如果你是一个小时工,这可能会带来好处,或者你可以从更简洁的设计开始。您的选择。
  • 我同意,我完成了一个重大的重构,完全做到了,但是正如我所说,我仍然想知道如何使一个集合只能用 Jackson 序列化,如果我下次需要它,因为它不适用于集合并不明显(除非我做错了什么并且它确实如此,或者是因为 Kotlin 不兼容)
  • 嘿,stackoverflow.com/a/45861877/1942642 回答了你的问题吗?

标签: spring-boot jackson kotlin


【解决方案1】:

为了忽略反序列化的某些字段,您应该使用JsonIgnorePropertiesallowGetters=true。这样,users 字段将在序列化时填充,但在反序列化时会被忽略。

@JsonIgnoreProperties(value = "users", allowGetters=true)
class Task {
    @ManyToMany
    var users: MutableSet<User> = HashSet()
}

您可以在以下位置找到更多信息:https://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonIgnoreProperties.html#allowGetters()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2011-08-25
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多