如何将 RequestBody 中的嵌套 JSON 转换为实体

How to convert nested JSON in RequestBody to an entity

以下是对我端点的 POST 请求的正文:

{
    "availabilityMap":
    {
        "2021-07-18":["9AM-10AM", "OT"],
        "2021-07-19":["9AM-10AM", "OPD"],
        .
        .
    }
    
}

以下是我的控制器的框架:

@PostMapping(value = "/appointment", consumes = MediaType.APPLICATION_JSON_VALUE,
        produces= MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity newAppointment(@RequestBody /* WHAT TO PUT HERE?*/) {

}

如何定义实体以便 @RequestBody 自动转换为实体?这可能吗?

public class RequestVO {

    public Map<String, List<String>> availabilityMap;

    public Map<String, List<String>> getAvailabilityMap() {
        return availabilityMap;
    }

    public void setAvailabilityMap(Map<String, List<String>> availabilityMap) {
        this.availabilityMap = availabilityMap;
    }
}

{}可以表示为对象或映射,[]可以表示为Collection的实现class。 (常用的有List和Set,也是接口,具体的classes由序号框架指定,也可以使用HashMap等实现classes。)对于{},使用对象还是地图取决于字段是否固定。在示例中,availabilityMap 是一个 fixed-name 字段,因此使用了对象。 2021-07-18是不定日期或者其他class,所以用Map。对于一个对象,如果它的字段是另一个对象,你可能需要写一个新的java class.

一般情况下,我们会为请求和响应准备dto或资源。如果你的请求或者响应是和数据库相关的,应该是dto,否则应该标记为资源,可以使用MapStruct进行自动映射操作。

@Data
public class RequestDto {

    public Map<String, List<String>> availabilityMap;

}