Java如何创建适配含键值对列表请求体的POJO类 解决属性空值问题
问题根源
- DTO结构与JSON请求体结构不匹配:JSON中
availabilityMap对应的value直接就是key为日期、value为时间段列表的Map结构,你额外多封装了一层AvailabilityMap类,还在内部定义了名为availableDates的Map属性,Jackson反序列化时找不到对应字段映射,自然会赋值为null。 - 额外说明:你给出的JSON示例中存在两个相同的
2021-07-20键,属于JSON语法不支持的笔误,实际请求应为不同日期键,不影响结构适配逻辑。
正确实现方案
方案1:简化DTO,删除多余封装类(推荐)
直接把AvailabilityDto的属性定义为对应结构的Map即可,不需要单独编写AvailabilityMap类:
@Getter @Setter public class AvailabilityDto { private HashMap<LocalDate, List<String>> availabilityMap; @Override public String toString() { return "AvailabilityDto{" + "availabilityMap=" + availabilityMap + '}'; } }
方案2:保留AvailabilityMap封装类的适配方式
如果业务需要保留这层封装,给availableDates属性添加@JsonAnySetter注解,让Jackson把当前层级的所有键值对都映射到该Map属性中:
@Getter @Setter public class AvailabilityMap { @JsonAnySetter HashMap<LocalDate,List<String>> availableDates; @Override public String toString() { return "AvailabilityMap{" + "availableDates=" + availableDates + '}'; } }
使用该方案时原有AvailabilityDto不需要修改。
注意事项
- 确保SpringBoot项目的web模块依赖正常,默认内置的
jackson-datatype-jsr310模块可以自动将字符串格式的日期反序列化为LocalDate类型,无需额外配置。 - 接收请求的Controller方法中,DTO参数必须添加
@RequestBody注解,否则不会触发JSON反序列化流程。
内容的提问来源于stack exchange,提问作者Sakura
相关产品推荐
相关产品推荐

