openFeign遠程調用時使用Mybatis-plus的IPage接口進行返回分頁數據失敗的記錄
1. 問題描述
前置條件:
- 使用openFeign+mybatis-plus
- 使用json格式進行數據的傳輸,即限制web傳輸的數據格式為 content-type = application/json
問題:
1. 微服務A 通過 openFeign 調用微服務B 的接口時返回數據為 null
2. 直接調用微服務B的接口,返回數據正常
2. 問題解決過程
1. 首先在微服務B中查看該接口返回的數據,是否正常
結果:
1. 有數據進行返回
2. 對數據進行打印時顯示為對象地址,而非期望的json字符串
2. 試圖修改返回的Object,改為Object.toString()
結果:
打印出的數據仍為對象地址
3. 試圖修改返回的Object,將其進行Json序列化,即改為JSONObject.toJSON(data),進行返回
結果:
打印的數據為期望的的json字符串,但如此改動十分不友好,不利於后續的開發,而且需要修改方法的返回類型,故放棄
4. 進一步分析發現,mybatis-plus中的IPage接口雖然實現了Serializable接口,但未實現Json序列化
解決方案:
- 自定義一個Page類,繼承IPage接口的實現類Page,實現Json序列化即可
實現:
public class SerializableForFastJsonPage<T> extends Page<T> { @Override public String toString() { return JSONObject.toJSONString(this);// 實現json序列化 } }
結果:
使用SerializableForFastJsonPage類替換IPage類,即可實現json序列化數據進行返回
5. 注意:在接收方進行反序列化的時候,需要指定具體的接收的數據類型,不可使用泛型,使用泛型會導致接收不到數據