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

Jackson反序列化默认值缺失:Lombok下集合未取默认空列表

解决Jackson反序列化时Lombok类集合字段为null的问题

我之前也踩过类似的坑,结合Lombok和Jackson的时候,很容易因为注解组合或者字段初始化的细节,导致集合字段没拿到预期的空列表。咱们一步步拆解解决:

核心原因

Java里引用类型(比如List)的默认值是null,而Jackson反序列化时,如果JSON中没有对应字段,只会保留字段的原始默认值,不会主动帮你创建空集合。再加上Lombok的注解如果配置不到位,也会让默认值无法生效。

解决方案

1. 显式初始化集合字段(最简单直接)

在类定义里直接给集合字段赋默认空集合,Lombok的@Data等注解会保留这个初始化值:

@Data
public class YourClass {
    // 可选属性,默认null(符合需求)
    private String someField;
    // 可选属性,显式初始化为空列表
    private List<String> values = new ArrayList<>();
}

这样不管Jackson反序列化时JSON里有没有values字段,这个字段都会是ArrayList空实例,不会是null。

2. 配合@Builder使用时用@Builder.Default

如果你的类用了Lombok的@Builder,直接初始化集合字段会被Builder逻辑覆盖,这时候需要加上@Builder.Default注解强制Builder使用默认值:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class YourClass {
    private String someField;
    @Builder.Default
    private List<String> values = new ArrayList<>();
}

这个注解会告诉Lombok的Builder,当没有主动设置values时,使用你指定的默认空列表,同时Jackson反序列化也能正确继承这个默认值。

3. 全局配置Jackson自动填充空集合

如果想让所有集合类型字段都自动用空集合代替null(适合多类统一处理的场景),可以配置ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper();
// 对所有缺失的集合字段,使用空集合而非null
objectMapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.AS_EMPTY));

这样不管哪个类的集合字段,只要JSON里没提供,都会被初始化为对应的空集合(比如List对应ArrayList,Set对应HashSet)。

4. 检查Lombok注解组合是否正确

Jackson反序列化默认需要类有无参构造方法。如果你用了@AllArgsConstructor,一定要配合@NoArgsConstructor,否则Jackson可能无法实例化你的类,间接导致字段值异常:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class YourClass {
    private String someField;
    private List<String> values = new ArrayList<>();
}

验证示例

比如你反序列化这个JSON:

{"someField": "test"}

用上面任意一种方案,values字段都会是空列表而非null,完全符合你的预期。

内容的提问来源于stack exchange,提问作者skappler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:24:41