You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:15:06