先介紹一下業務場景,如今有一個業務對象基類:
public class JsonRequest{
private String msg;
private String code;
}
如今有N多子類對其進行繼承,而且自帶一個業務對象
public class DetailJsonRequest extends JsonRequest{
private T body;
}
想這樣的一個對象,可能被用於序列號傳輸對象,在微服務中可能被用到
那麼如今,我做爲業務受理方,須要接受消費方發送來的請求,通常經過驗籤解密以後,會獲取到一個字符串,咱們這裏假設序列化方式爲Json
那麼解析之後,我獲取到這麼一個字符串:
String content = "{\"body\":{\"id\":\"1123\",\"name\":\"macky\"},\"code\":\"1\",\"msg\":\"成功\"}";
接下來,根據我須要的業務類型,進行轉換:
DetailJsonRequest jsonObject = JSON.parseObject(content, DetailJsonRequest.class);
DetailJsonRequest jsonObject = JSON.parseObject(content, new TypeReference<DetailJsonRequest<JsonContent>>(JsonContent.class) {});
接下來,讓咱們看看效果:
DetailJsonRequest(body={"name":"macky","id":"1123"})
DetailJsonRequest(body=JsonContent(id=1123, name=macky))
發現了啥貓膩了嗎,這裏丟失了msg和code信息,大驚失色!!
通過各類查找,經過文檔、github issue等等等,發現了罪魁禍首——toString方法
我在日常工做中,會使用到lombok插件,而後會數據打上@data註解,輕鬆完成一個bean構造
因此上述的JsonRequest和DetailJsonRequest都掛着@data註解
如今,給DetailJsonRequest加上另外一個註解:@ToString(callSuper=true)
或者是若是你沒有使用lombok,那麼使用這樣一個toString方法:
@Override
public String toString() {
return "DetailJsonRequest{" +
"body=" + body +
", msg='" + super.getMsg() + '\'' +
", code='" + super.getCode() + '\'' +
'}';
}
從新驗證,會發現倆個方式的解析均可以獲得msg和code信息:
DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body={"name":"macky","id":"1123"})
DetailJsonRequest(super=JsonRequest(msg=成功, code=1), body=JsonContent(id=1123, name=macky))
問題解決了,那麼如今回過頭來看看,爲什麼這樣作是能夠的,知其然,知其因此然
……未完待續
如如有錯,煩請指出