亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

記一次openfeign反序列化異常復盤

標簽:
Spring Cloud

前言

之前业务部门有2个通用响应类,一个是负责和前端交互的响应类AjaxResult,一个是负责和后端RPC接口交互的响应类RpcResult。一开始这两个响应类的值字段都一样,形如下

	private Boolean success;
	private String message;
	private Integer code;
	private T data;

因为前端和后端部署在不同的服务器上,某次因为前端和后端的时间不一致,导致出现业务异常,后面业务的架构师说,业务统一以后端的时间为准。于是AjaxResult新增了一个时间字段nowDateTime,而RpcResult维持不变。今天的要讲解的故事就是由此拉开序幕

正文

一开始因为职能划分比较清楚,前端和后端都是统一用AjaxResult交互,后端与后端统一通过RpcResult交互,后边随着时间的推移和人员的流动,这个边界就被打破了。AjaxResult和RpcResult混着用,终于在某次openfeign反序列化调用,出现了

org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "nowDateTime"(Class com.xx.xx.RpcResult)

异常,当时业务提出的解决思路也是很简单,就是在RpcResult这类中,也加上nowDateTime字段。这样确实可以解决问题,但是某个研发提了一个疑问,因为AjaxResult没在他们那边维护,AjaxResult对他们就是一个黑盒子,哪天AjaxResult又加了新增字段,如果没通知到位,岂不是仍然报错。有没有一劳永逸的解法,答案是有的,就是在RpcResult这个类上,加上如下注解

@JsonIgnoreProperties(ignoreUnknown = true)

该注解的意思是忽略RpcResult无法识别的属性

总结

虽然问题解决了,但是我在参加他们业务复盘的时候,我脑海中一直有2种声音,一种是分成2种响应值,职责更清晰,2个响应值类可以各自发展,但是遇到全局异常处理,如果是业务异常是好办,如果是出现系统级异常,如果响应值是以AjaxResult序列化出去,而被RpcResult反序列回来,是不是也会有再次出问题。

其次在我看来,AjaxResult和RpcResult本质上就是同个东西,分成2种不同类,是不是过度设计了,是不是增加问题的复杂度,如果响应值都统一改成AjaxResult,是不是就可以避免上面的反序列问题

Bug也许能解决,但技术的取舍有时候是没有正确答案,有的只是在当下做了最符合业务发展规律的决定

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消