【问题标题】:Is it possible to determine whether parameters are present in request JSON是否可以确定请求JSON中是否存在参数
【发布时间】: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);
}

根据请求负载中是否存在startDateendDate 字段,我需要确定是否应该更新数据库中的start_dateend_date

所以如果请求 JSON 是:

{
    "name" : "action name",
    "startDate" : null,
    "endDate" : null
}

那么我应该start_dateend_date 字段更新为NULL。

但如果请求 JSON 是:

{
    "name" : "action name"
}

那么我不应该更新 start_dateend_date 并保持原样。

那么是否可以确定参数startDateendDate 是否存在于HTTP 请求中?也许杰克逊提供了一些开箱即用的解决方案?

【问题讨论】:

  • 不是 PUT 操作应该如何工作。放置数据应始终更新所有字段。 JSON 中缺少的字段相当于 将字段设置为null。在这种情况下,PUT 操作应该更新数据库,以便结果也是null(在那些字段中)。您正在询问如何仅更新对象的一部分。为此,存在 PATCH 操作,其 JSON 表示看起来相似但不同。

标签: java json spring-boot serialization jackson


【解决方案1】:

您可以使用ObjectMapper.readTree 读取JsonNode 对象的树,然后使用JsonNode.has 方法检查节点中是否存在字段:

@PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
public ResponseEntity<Object> updateAction(@RequestBody String json) {
    Action action = new Action();
    JsonNode jsonNode = objectMapper.readTree(json);
    if (jsonNode.has("startDate")) {
        // fill action object
    }

    actionRepository.save(action);
}

【讨论】:

    【解决方案2】:

    ObjectMapper 的术语中,缺少的字段和设置为null 的字段是相同的。因此,通过将String 反序列化为POJO,您将无法查看字段是否存在。但是,如果这是您想要做的,那么您可以尝试将 json 反序列化为 Map,例如:

    @PutMapping(path = "/action", produces = "application/json; charset=UTF-8")
    public ResponseEntity<Object> updateAction(@RequestBody Map payload) {
        if(payload.containsKey("")) {
            //Something
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2012-06-21
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多