记录由FastJSON和lombok的Accessors标签引起的反序列化的坑

坑:

  如果父类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 (!(method.getReturnType().equals(Void.TYPE) || method.getReturnType().equals(clazz))) {
    continue;
}

4.入参数量为1

后面还有一系列的筛选逻辑,问题解决了,所以就不一一看了。

你可能感兴趣的:(JSON,Java,java,json,lombok,Json,序列化反序列化)