单个POJO用于​​具有验证的不同REST操作

时间:2019-01-29 21:57:02

标签: java spring-boot jackson

我正在设计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的公共字段,另一个具有POST的公共字段,但是感觉很混乱,尤其是当我们处理比简单示例更复杂的对象时。

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

1 个答案:

答案 0 :(得分:0)

如果您打算提供休息服务,那么您无论如何都不需要身体中的ID。该ID将作为路径变量来自网址:

POST myobjects

GET myobjects/{id}

PATCH myobjects/{id}