默认情况下,Spring Boot 出错时,页面显示如下格式的错误信息:
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sun Dec 12 11:18:04 CST 2021 There was an unexpected error (type=Not Found, status=404).
原理:使用 @RestControllerAdvice 加 @ExceptionHandler 注解来实现,
- 注意:@RestControllerAdvice只能拦截Controller层的异常不会拦截Interceptor的异常;
- 优点:把异常统一处理,减少代码的重复编写,提高了可维护性;
- 缺点:只能处理Controller层的异常,对于Interceptor层的异常,Spring内部的异常无能为力;
【推荐】SpringBoot系列(十)统一异常处理与统一结果返回(优化:把里面的 @ControllerAdvice 和 @ResponseBody 删掉,换成 @RestControllerAdvice)
Spring Boot @RestControllerAdvice 统一异常处理
【工作笔记】
1.全局异常类:
package love.hibotella.common.exception;
import love.hibotella.common.model.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 全局异常处理
*/
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
public Result<Object> exceptionHandler(Exception e) {
logger.error(e.getMessage(), e);
ErrorEnum serverError = ErrorEnum.INTERNAL_SERVER_ERROR;
return Result.error(serverError.getErrorCode(), serverError.getErrorMsg(), null);
}
}
2.错误枚举类:
package love.hibotella.common.exception;
/**
* 常用异常 枚举
*/
public enum ErrorEnum {
SUCCESS("200", "操作成功"),
NO_AUTH("401", "请先登录"),
NO_PERMISSION("403", "没有权限"),
NOT_FOUND("404", "未找到该资源"),
INTERNAL_SERVER_ERROR("500", "服务器内部错误"),
;
/**
* 错误码
*/
private String errorCode;
/**
* 错误信息
*/
private String errorMsg;
ErrorEnum(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
}
3.Result<T> 业务结果类: