前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记一次openfeign反序列化异常复盘

记一次openfeign反序列化异常复盘

原创
作者头像
lyb-geek
发布2024-03-05 10:40:12
1190
发布2024-03-05 10:40:12
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路

前言

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

代码语言:java
复制
	private Boolean success;
	private String message;
	private Integer code;
	private T data;

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

正文

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

代码语言:java
复制
org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "nowDateTime"(Class com.xx.xx.RpcResult)

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

代码语言:java
复制
@JsonIgnoreProperties(ignoreUnknown = true)

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

总结

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

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档