侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

健壮性

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 113 阅读 / 1,267 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
MethodArgumentTypeMismatchException spingMVC异常,参数类型不匹配 .
给springMVC 多传参数没事,少传参数string为null, int 报异常.Long 为空. 可能是包装类型的事.


参数异常
null
类型错误
必传值检测
长度检测
类型检测

读取数据库异常
已存在
字段不全

类型错误

处理返回结果异常
注意空指针异常

一、进行统一的业务处理响应
根据蚂蚁金服开放平台的标准返回,一个 response 至少应当有4个返回值。
1、isSuccess:调用是否成功
2、data:返回的响应数据
3、errorCode:错误码
4、errorMsg:错误信息
这就要求我们的接口要有标准的统一的 response ,那怎么实现呢?
1、Spring 切面, JDK 动态代理,Cglib 动态代理等用代理类实现
2、匿名子类,使用一个公共的 Executor 来负责处理所有的请求。
上面两种模式都可以实现标准的 response 的封装,那么具体要封装哪些东西呢?其实最主要的就是统一的 try catch,防止出现任何的 500 错误给到调用方。
------ 为什么要在最外层去完成呢?------
因为 500 错误对于调用方来说是致命而且是毫无价值的,无论调用方是前端还是其他的业务系统
------ 设定统一的错误码 ------
例如:
参数错误:PARAMETER_ERROR
数据库错误: DATABASE_ERROR
外部系统错误:OUTER_SYSTEM_ERROR
如果有了上面的这些错误码以及错误信息,业务方至少可以告知用户究竟发生了什么事,也可以设定一些列的告警以及自动化运维的方式来处理这些错误。
二、参数检查
在进行真正的逻辑处理前,应当对入参进行一系列的校验,以保持后续业务处理逻辑的轻量,这也是 fast fail 思想的指导,有错误尽早结束处理。
具体是怎样的呢?我们假设参数为 m.
if( null == m ){return ;}

进行空判断,防止后续滴啊用m发生 NullPointerException,但这里也不建议抛出NPE,因为看到日志也会很迷惑。
if( StringUtils.isEmpty( m ) ){return ;}

字符串是否为空串
if( CollectionUtils.isEmpty.isEmpty( m ) ){return ;}

集合是否为空或者null
try{ JSON.parseObject( m ); return true;}catch(JSONExceptin e){ return false;}

判断字符串是否为 JSON 格式
三、重试机制
对于特定的外部系统错误,可以尝试多次重试这种策略,当然这也是简历在对方的服务是幂等的前提下。这样做在某些网络不稳定的情况下可以提高响应成功率。
四、幂等机制
什么叫幂等?意思就是 无论何时何处何人,只要是先攻的请求,就应当有相同的响应,直到到达终态。
这个原则并不关注上一次的执行结果,企鹅本次结果不应当因为上一次请求的部分成功或者失败而导致某些中间状态不一致导致请求失败。
0

评论区