购买模板做网站,凡科建站小程序,小型电子商务网站规划建设方案,做百度推广网站找谁好前言
之前业务部门有2个通用响应类#xff0c;一个是负责和前端交互的响应类AjaxResult,一个是负责和后端RPC接口交互的响应类RpcResult。一开始这两个响应类的值字段都一样#xff0c;形如下 private Boolean success;private String message;private Integer code;private…前言
之前业务部门有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也许能解决但技术的取舍有时候是没有正确答案有的只是在当下做了最符合业务发展规律的决定