【问题标题】:Single POJO for different REST operations with validation带有验证的不同 REST 操作的单个 POJO
【发布时间】:2019-01-29 21:57:02
【问题描述】:

我正在设计一个 REST 服务,并且遇到了一个问题,即对于给定的对象,我有多个“状态”。

  • 在初始 POST 操作中到达的对象。
  • 我存储在数据库中的对象
  • 我通过 GET 返回的对象
  • 我期望在 PATCH 上的对象

例如

class MyObject {

// Unwanted on POST
// Required on PATCH
// Included on GET
@JsonProperty("id")
private UUID id;

// Everywhere
@NonNull
@JsonProperty("name")
private String name;

// Field I need for internal processing but don't want included in REST.
private AuditTrail stuff;

@JsonCreator
@Builder
public MyObject(...) { ... }
}


...


@Get
public ResponseEntity myFunction(HttpServletRequest request,
                                 @RequestBody @Valid MyObject requestBody) {
...
}

我遇到的问题是在 POST 上,当省略 id 时,反序列化失败。我使用@JsonIgnoreProperties() 解决了这个问题,但现在在 PATCH 上,我确实希望 id 存在,如果它被省略,事情就会起作用。

我们玩弄的另一种选择是拥有两个对象。第一个是 POST 的公共字段,另一个是从它扩展而来的,其余的都从它扩展而来,但感觉很混乱,尤其是当我们处理比简单示例更复杂的对象时。

这实际上不是问题,因为无论如何我都会验证和清理输入,但我想知道 Jackson 是否有一种干净的方法来解决这个问题。

【问题讨论】:

    标签: java spring-boot jackson


    【解决方案1】:

    如果您计划进行休息服务,那么无论如何您都不需要正文中的 id。 id 将来自 url 作为路径变量:

    POST myobjects

    GET myobjects/{id}

    PATCH myobjects/{id}

    【讨论】:

    • 好吧,也许我为我的内脏示例选择了错误的字段。假设您有一个 lastUpdated 字段。这在 POST 上不是必需的,因为它不是用户控制的,但你在 GET 上确实有它。而且您确实需要在某个时候返回对象中的 ID,否则用户无法知道它:)
    • @JsonProperty(access = Access.READ_ONLY)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多