如何阻止Jackson ObjectReader覆盖已有数据?
解决Jackson ObjectReader更新时覆盖嵌套字段原有值的问题
问题核心:使用readerForUpdating更新已有对象时,Jackson默认会替换整个嵌套对象实例,而非合并字段。比如你传入仅包含fieldTypeA.valueB的JSON时,原有fieldTypeA.valueA会被置为null,因为新的FieldTypeA实例只设置了valueB,其他字段用默认值null。
解决方案1:给嵌套字段添加@JsonMerge注解
直接在需要合并的嵌套字段上标注@JsonMerge,告诉Jackson合并该字段的现有实例与JSON中的数据,而非替换:
import com.fasterxml.jackson.annotation.JsonMerge data class Model( @JsonMerge val fieldTypeA: FieldTypeA? = null, ) data class FieldTypeA( val valueA: String? = null, val valueB: String? = null, )
修改后,执行readerForUpdating.readValue(jsonRequest)时,Jackson会将JSON中的valueB合并到已有的fieldTypeA实例上,保留原有valueA的值。
解决方案2:全局开启合并更新特性
如果不想逐个字段加注解,可以给ObjectMapper全局开启USE_MERGE_FOR_UPDATES特性,让所有readerForUpdating操作默认合并嵌套对象:
import com.fasterxml.jackson.databind.MapperFeature import com.fasterxml.jackson.module.kotlin.KotlinModule import com.fasterxml.jackson.databind.ObjectMapper val customMapper = ObjectMapper() .registerModule(KotlinModule()) .enable(MapperFeature.USE_MERGE_FOR_UPDATES) val readerForUpdating = customMapper.readerForUpdating(existingEntity)
注意事项
如果JSON中明确将嵌套字段设为null(比如{"fieldTypeA": null}),原有值仍会被覆盖为null——这是明确的赋值操作,与"缺少字段"的场景不同。
内容的提问来源于stack exchange,提问作者maloney
相关产品推荐
相关产品推荐

