【发布时间】:2019-11-28 06:25:17
【问题描述】:
我正在执行 UPDATE 操作,以便将传入 POJO 中设置的所有 non-null 属性复制到另一个对象(相同类型)中,嵌套属性也会发生这种情况。
例如:
POJO:
public class Person {
private String homePhoneNumber;
private String officePhoneNumber;
private Address address;
public String getHomePhoneNumber() {
return homePhoneNumber;
}
// getter/setters
}
public class Address {
private String street;
private String houseNumber;
public String getStreet() {
return street;
}
// getter/setters
}
// Source
Person sourcePerson = new Person();
sourcePerson.setHomePhone("123");
Address address1 = new Address();
address1.setStreet("Street");
sourcePerson.setAddress(address1);
//Dest person
Person destPerson = new Person();
destPerson.setOfficePhone("456");
destPerson.setHomePhone("123");
Address address2 = new Address();
address2.setStreet("Street2");
address2.setHouseNumber("246");
destPerson.setAddress(address2);
ObjectMapper mapper = new ObjectMapper();
//skip setters for null values
mapper.setDefaultSetterInfo(JsonSetter.Value.forValueNulls(Nulls.SKIP));
Person result = mapper.updateValue(destPerson, sourcePerson);
所以我想复制sourcePerson 中设置的所有non-null 属性以在destPerson 中复制,即覆盖 仅destperson 的那些destperson 属性设置,保留其他属性不变。
使用
Person result = mapper.updateValue(destPerson, sourcePerson);
不适用于嵌套属性。它将整个 Address 对象从源替换到目标
我通过 jackson 搜索找到 jackson 中的 merge 功能:
mapper.setDefaultMergeable(true);
但是,添加此配置会使sourcePerson 中的null 值也使destPerson 中的值无效,这似乎很奇怪。
mapper.configOverride(Address.class).setMergeable(true);
上述配置适用于我想要的。但是我有很多 POJO 嵌套资源,所以我不想要每个 POJO 的特定配置。
这可以通过jackson 以干净的方式实现吗?
【问题讨论】:
标签: json serialization jackson deserialization jackson-databind