懒癌晚期,事情过去很久了才终于要记录。
事情的起因是这样的:
项目中有若干dto,其中一个父类dto,是基类,若干子类dto,是子类,大概是这个意思(直接在csdn编辑器里手敲代码,格式凑合看吧。。):
public class FatherDto implements Serializable {
private String fatherOne;
private String fatherTwo;
//序列化id,无参构造方法,get/set方法全部略
}
public class SonDtoOne extends FatherDto{
private String sonOne;
//序列化id,无参构造方法,get/set方法全部略
}
public class SonDtoTwo extends FatherDto{
private String sonTwo;
//序列化id,无参构造方法,get/set方法全部略
}
然后,有个接口,通过feign去调用某个服务方法,返回的数据类型是List<FatherDto>
,而实际上在服务方法实现中向list中加入的元素有可能是父类,也有可能是子类。
问题来了,通过rest调用接口,返回的数据元素里只有父类FatherDto的字段,子类中的独有字段全都不见了。
问题就在于,JSON标准是不支持自省的,它不标记类型,你不知道它是什么类型
项目中用的fastjson,解决方案:在dto实体类上统一加上如下注解:
@JSONType(serialzeFeatures = { SerializerFeature.WriteClassName })
加上这个之后,就可以标注类型了,再调用服务返回的元素,子类字段就都会出现了。
值得一提的是,我上面写的这些类,成员变量都是基本类型的,如果成员变量是其他对象的引用,个人感觉也应该对变量所属的类上也加上这个注解,这个我没有试过。
后来百度了一下,这个叫做“自省功能”,特此记录一下。