上篇博客:异常处理返回结构体,做到全局统一,仍然会出现一些情况。
针对未找到接口爆出404异常,返回结构体如果没有处理的话会变成下面这样,不会走全局异常处理,这样的话就没有完全做到全局异常统一处理。
{
"timestamp": "2023-12-15T03:16:13.576+00:00",
"status": 404,
"error": "Not Found",
"message": "",
"path": "/sysUser/detail111"
}
需要关闭默认的静态资源路径映射和开启未找到异常处理
# 当HTTP状态码为4xx时直接抛出异常,默认是关闭的
spring.mvc.throw-exception-if-no-handler-found=true
# 关闭默认的静态资源路径映射,默认是开启的
spring.resources.add-mappings=false
处理之后如果调用未有的接口,全局异常中Exception会处理。
/**
* 系统异常
*/
@ExceptionHandler(Exception.class)
public ResultBody handleException(Exception e, HttpServletRequest request) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e);
return ResultBodyUtils.fail(ErrorCode.SYSTEM_ERROR_500, requestURI);
}
返回结果:
{
"code": 500,
"message": "Interface /sysUser/detail111 internal error, please contact the administrator",
"data": null
}
如果需要更加具体的异常处理,还需要在全局异常中进行如下处理。
/**
* 处理 HTTP 404 错误
*/
@ExceptionHandler({NoHandlerFoundException.class, HttpRequestMethodNotSupportedException.class})
public ResultBody handleNotFound(HttpServletRequest request, Exception e) {
String requestURI = request.getRequestURI();
log.error("请求地址'{}'不存在.", requestURI, e);
return ResultBodyUtils.fail(ErrorCode.SYSTEM_ERROR_404, requestURI);
}
返回结果:
{
"code": 404,
"message": "Interface /sysUser/detail111 Not Found",
"data": null
}
这样就可做到在系统中出现任何问题,它的返回结构体都可做到统一。