业务系统突然抛出一个数据转换异常,显示报文比实体类多了一个bankSellMoney 属性;

image.png

image.png
原因是其他同事在新版本中共同的父类中增加了一个属性bankSellMoney,但是我的服务还是引用旧版的父类。虽然没有显性的给它赋值,但是由于默认空置也序列化了导致反序列化时找不到属性
思考:应该没有匹配上的属性不需要拷贝属性值呀怎么直接抛出异常了,认真对比了一下jackson 和阿里的fastjson;
jackson
从默认配置中看到如果实体中没有这个属性并且没有一个set 方法 将抛出一个异常

image.png
fastjson
从默认配置中看到默认忽略没有匹配上的属性,换言之就是只有属性名完全一致的字段才会设值;

image.png
通过上面Jackson 和 fastjson的源码默认配置可知 fastjson 的兼容性更好,jackson可能要求更高的约束性吧;
解决:
方案一:
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String json = mapper.writeValueAsString(yourObject);
System.out.println(json);
直接忽略空属性
方案二:
MAPPER.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule())
.registerModule(new ParameterNamesModule())
//添加默认时区为东八区
.setTimeZone(TimeZone.getTimeZone("GMT+8:00"))
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
// 忽略JSON中存在但对应Java对象不存在的属性
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);