【发布时间】:2019-08-03 21:22:11
【问题描述】:
我的数据库中有一个action 表,因此我有Action 实体和ActionDTO,它们基本相同。
实体是:
@Entity
@Table(name = "action")
public class Action {
@Column(name = "name")
private String name;
@Column(name = "start_date")
private Date startDate;
@Column(name = "end_date")
private Date endDate;
//setters & getters
}
DTO 是:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ActionDTO {
private String name;
private Date startDate;
private Date endDate;
//setters & getters
}
在控制器中有一个更新action表的方法:
@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody ActionDTO actionDTO) {
Action action = new Action();
// setting parameters to Action entity
actionRepository.save(action);
}
根据请求负载中是否存在startDate 和endDate 字段,我需要确定是否应该更新数据库中的start_date 和end_date。
所以如果请求 JSON 是:
{
"name" : "action name",
"startDate" : null,
"endDate" : null
}
那么我应该将start_date 和end_date 字段更新为NULL。
但如果请求 JSON 是:
{
"name" : "action name"
}
那么我不应该更新 start_date 和 end_date 并保持原样。
那么是否可以确定参数startDate 和endDate 是否存在于HTTP 请求中?也许杰克逊提供了一些开箱即用的解决方案?
【问题讨论】:
-
这不是 PUT 操作应该如何工作。放置数据应始终更新所有字段。 JSON 中缺少的字段相当于 将字段设置为
null。在这种情况下,PUT 操作应该更新数据库,以便结果也是null(在那些字段中)。您正在询问如何仅更新对象的一部分。为此,存在 PATCH 操作,其 JSON 表示看起来相似但不同。
标签: java json spring-boot serialization jackson