本文作者:suxingrui
本文链接:https://blog.csdn.net/suxingrui/article/details/103789497
版权声明:本文为原创文章,转载请注明出处。
回顾2019年碰到的问题及解决方式
问题:Web异常处理:MissingServletRequestParameterException&MaxUploadSizeExceededException
问题发现:
开发过程中,前端因为少传required=true的参数,而导致调用失败,频繁需要与后台开发确认问题
如果能够直接在返回错误信息中反馈给前端开发人员,就能够减少这部分不必要的问题调查时间
(PS:当然这个信息不宜在生产环境开放,不然,接口信息很快就被确认了)
同样上传图片过大最好也是有足够的提示显示给用户
调查分析:
无
解决方法:
拦截异常,返回信息,有两种实现方式
1、直接拦截缺少参数的异常:MissingServletRequestParameterException
@Slf4j
@Conditional(ProdDisableCondition.class)
@ControllerAdvice(annotations = {RestController.class})
public class MissingRequestParameterExceptionHandler {
@ResponseBody
@ExceptionHandler(value = MissingServletRequestParameterException.class)
public Object exceptionHandler(MissingServletRequestParameterException e) {
log.error("System Exception:{}", e.getMessage());
ResultBean<String> resultBean = new ResultBean<>();
resultBean.setResultCode(CommonRuntimeException.Code.PARAM_FIELD_MISSING_000107);
resultBean.setResultDesc("Missing Request Parameter");
resultBean.setData(e.getMessage());
return resultBean;
}
}
2、拦截Exception异常,在里面if else处理:MaxUploadSizeExceededException
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Object exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) {
// 默认为未知异常
ResultBean<Object> resultBean = ResultBean.unknowError();
// 如果是业务逻辑异常,返回具体的错误码与提示信息
if (e instanceof AbstractRuntimeException) {
AbstractRuntimeException ex = (AbstractRuntimeException) e;
resultBean.setResultCode(ex.getCode()).setResultDesc(ex.getMessage());
} else if (e instanceof MaxUploadSizeExceededException) {
resultBean.setResultCode(CommonRuntimeException.Code.UPLOAD_IMAGE_BIG_ERROR_000108)
.setResultDesc("上传图片过大,图片大小限制5MB以内。")
.setData(e.getMessage());
} else {
// 对系统级异常进行日志记录
log.error("System Exception:" + e.getMessage(), e);
}
return resultBean;
}