@ControllerAdvice + @ExceptionHandler 进行
全局的 Controller 层异常处理,
不用在 Controller 层进行 try-catch 了
优点:
将 Controller 层的异常和数据校验的异常进行统一处理,减少模板代码,减少编码量,提升扩展性和可维护性。
@ControllerAdvice
public class GlobalExceptionHandler {
private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultModle exceptionCatch(Exception ex) {
if (ex instanceof MissingServletRequestParameterException) {
MissingServletRequestParameterException missingServletRequestParameterException =
(MissingServletRequestParameterException) ex;
String parameterName = missingServletRequestParameterException.getParameterName();
return new ResultModle(ErrorConstants.INVALID_PARAM_CODE, ErrorConstants.INVALID_PARAM_MSG + " >> " + parameterName);
} else if (ex instanceof HttpRequestMethodNotSupportedException) {
HttpRequestMethodNotSupportedException methodNotSupportedException =
(HttpRequestMethodNotSupportedException) ex;
return new ResultModle(ErrorConstants.COMMON_ERROR_CODE, ex.getMessage());
} else {
logger.error("服务器报错 >> {}", ExceptionUtils.getStackTrace(ex));
return ResultModle.serverError();
}
}
@ExceptionHandler(BusinessException.class)
@ResponseBody
public ResultModle handleBusinessException(BusinessException ex) {
logger.error("业务层异常 >> {}", ExceptionUtils.getStackTrace(ex));
return ResultModle.commonError(ex.getMessage());
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResultModle handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
logger.error("数据验证异常 >> {}", ExceptionUtils.getStackTrace(ex));
return ResultModle.commonError(ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());
}
@ExceptionHandler(BusinessException.class) 声明了对 BusinessException 业务异常的处理,并获取该业务异常中的错误提示,构造后返回给客户端。
@ExceptionHandler(Exception.class) 声明了对 Exception 异常的处理,起到兜底作用,不管 Controller 层执行的代码出现了什么未能考虑到的异常,都返回统一的错误提示给客户端。