记录由FastJSON和lombok的Accessors标签引起的反序列化
fastjson常用方法
的坑
坑:
如果⽗类Bean使⽤Accessors标签,⼦类在JSON反序列化时不会填充⽗类的属性。
原因:
Accessors 标签⽣成的set⽅法有两种,chain模式是setXXX,返回值为this;fluent模式是XXX(),返回值为this。
两种⽅式返回值都是⽗类对象⽽不是⼦类对象。
在JSON.parseObject()⽅法中,会使⽤反射到⽬标类的set⽅法,然后使⽤set⽅法进⾏值填充,那怎么判断是不是set⽅法呢,他规定了⼏个不是set⽅法的判断:
位于com.alibaba.fastjson.util.JavaBeanInfo#build(Class<?> clazz, Type type)中
1.⽅法名⼤于等于4个字符(setA正好4个字符)
2.⾮statis
3.返回值为void 或者 返回值的类型为本类我的坑就才在这⾥,因为我在⽗类上使⽤Accessors注解,所谓该⽅法返回了⽗类类型,不是⼦类类型,所以⼦类反序列化时不认为这是⼀个set⽅法。
if (!(ReturnType().equals(Void.TYPE) || ReturnType().equals(clazz))) {
continue;
}
4.⼊参数量为1
后⾯还有⼀系列的筛选逻辑,问题解决了,所以就不⼀⼀看了。