懶癌晚期,事情過去很久了才終於要記錄。
事情的起因是這樣的:
項目中有若干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 })
加上這個之後,就可以標註類型了,再調用服務返回的元素,子類字段就都會出現了。
值得一提的是,我上面寫的這些類,成員變量都是基本類型的,如果成員變量是其他對象的引用,個人感覺也應該對變量所屬的類上也加上這個註解,這個我沒有試過。
後來百度了一下,這個叫做“自省功能”,特此記錄一下。