Jackson反序列化默认值缺失:Lombok下集合未取默认空列表
我之前也踩过类似的坑,结合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

