如何在Java Record类中使用Jackson的@JsonAnySetter注解?
Jackson @JsonAnySetter 在Java Record中生效的解决方案
问题原因
Java Record的反序列化逻辑依赖其标准构造器,Jackson会尝试将JSON字段与构造器参数一一匹配。直接在Record的Map组件上标注@JsonAnySetter无法生效,因为未知字段没有对应的构造器参数,Jackson无法自动将其填充到Map中。
可行解决方案
在Record内部定义一个带有@JsonAnySetter注解的方法,手动将未知字段写入Map组件。同时需要确保Map是可变的(比如HashMap),避免空指针异常:
record ThisDoesnt(String name, Map<String, String> others) { // 自定义紧凑构造器,确保others不为空且可变 ThisDoesnt { if (others == null) { others = new HashMap<>(); } } // 处理未知字段的方法,标注@JsonAnySetter @JsonAnySetter void addOtherField(String key, String value) { others.put(key, value); } }
说明
- 自定义紧凑构造器:Jackson反序列化时,如果构造器的
others参数没有匹配到对应JSON字段,会传入null。通过紧凑构造器初始化一个空的HashMap,避免后续调用put时抛出空指针异常。 - @JsonAnySetter方法:这个方法会接收所有未匹配到Record组件的JSON字段,将键值对存入
othersMap中。 - 版本要求:确保使用Jackson 2.12及以上版本,该版本开始正式支持Java Record的序列化与反序列化。
内容的提问来源于stack exchange,提问作者Kkkev
相关产品推荐
相关产品推荐

