首页 > 其他分享 >记一次openfeign反序列化异常复盘

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

时间:2024-03-05 10:33:55浏览次数:14  
标签:AjaxResult openfeign 响应值 private RpcResult 序列化 异常 复盘

前言

之前业务部门有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也许能解决,但技术的取舍有时候是没有正确答案,有的只是在当下做了最符合业务发展规律的决定

标签:AjaxResult,openfeign,响应值,private,RpcResult,序列化,异常,复盘
From: https://www.cnblogs.com/linyb-geek/p/17860167.html

相关文章

  • C#序列化和反序列化
    在C#编程中,序列化和反序列化是两个核心概念,它们分别代表着将对象状态转换为可以存储或传输的形式(通常是字节流),以及将这种形式的数据恢复为原始对象状态的过程。简单来说,序列化就是将对象转换为流(如文件、网络流等),而反序列化则是将这些流转换回原始对象。为什么要序列化和反序列化......
  • 面试复盘(一)
    1、List、Set、Map是否都继承Collection接口,他们的存取各有什么特点?List按顺序存储,允许随机访存元素可以重复Set不保证元素的顺序,也就是无法通过索引访问元素值唯一,通常用于值唯一的场景Map存储键值对,每个键都是唯一的但是允许值重复不保证元素顺序,也就是无法通过索......
  • ABC238 复盘
    ABC238复盘[ABC238A]ExponentialorQuadratic思路解析通过“指数爆炸”的特点可以发现当\(n\ge5\)或\(n=1\)时\(2^n\)是大于\(n^2\)的,所以一个if即可code#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn; cin>>n; if(n>=5||n==......
  • 8-5. 序列化保存数据文件
    安装newtonsoftjsonnewtonsoftjson是一个比JsonUtility更好的JSON工具,但是UnityRegistry没办法直接下载,需要点击PackageManager左上角的+号,点击AddpackagefromgitURL,输入com.unity.nuget.newtonsoft-json,进行安装使用newtonsoftjson序列化和反序列化使......
  • [DotnetSec]XmlSerializer 反序列化 分析
    Dotnet-XmlSerializer反序列化序列化和反序列化的演示Demo参考微软的文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.xml.serialization.xmlserializer?view=net-5.0XmlSerializer命名空间:System.Xml.Serialization程序集:System.Xml.XmlSerializer.dll演示......
  • 暑期集训 Day7 —— 模拟赛复盘
    ${\color{Green}\mathrm{Problem\1:最优包含}}$发现是DP,于是开始设计状态:DP[i][j]表示前一个字符串匹配到位置i,后一个匹配到j的最少修改次数。然后转移挂了:if(S[i]==T[j]){ DP[i][j]=min(DP[i][j],DP[i-1][j-1]);}else{ DP[i][j]=min(DP[i][j],DP[i-1][j-1]+1......
  • 暑期集训 Day5 —— 模拟赛复盘
    ${\color{Green}\mathrm{Problem\1:选数}}$签到题,一眼二分,但是打模板时死循环了:while(L<R){ intmid=(L+R)>>1; if(check(mid))L=mid; elseR=mid+1;}后来发现+1要写在check通过的地方,不然容易mid值永远不变。while(L<R){ intmid=(L+R)>>1; ......
  • 暑期集训 Day9 —— 模拟赛复盘
    ${\color{Green}\mathrm{Problem\1:大河的序列}}$巨思维...其实只需要输出序列max即可。死因:\({\tiny去你的}\)快速幂intFast_power(intbase,intpower,intmod){longlongres=1;while(power){if(power&1){res......
  • 暑期集训 Day10 —— 模拟赛复盘
    ${\color{Green}\mathrm{Problem\0:water}}$题如其名,可以用单调队列做,但是数据范围直接暴力枚举每一高度就行。最不会打错的,还是暴力,所以用暴力。${\color{White}\mathrm{}}$${\color{White}\mathrm{}}$${\color{White}\mathrm{}}$${\color{Green}\mathr......
  • 暑期集训 Day12 —— 模拟赛复盘
    ${\color{Green}\mathrm{Problem\1:Subarray}}$Map.${\color{Green}\mathrm{Problem\2:小z玩游戏}}$数学题YYDS。我的做法是:首先枚举x的所有二进制位,找里面的\(1\),由于y要比x小,于是我们可以把y的当前位变为\(0\),然后后面的位从全0到全1,用前缀和统......