有时我们为了提示更加的优雅需要对错误的返回信息做下非开发人员能看的懂的提示,但是这样对开发人员不是很友好,简单的平时通过提示可以处理的错误需要去看日志报错才能解决了,但普通用户看起来就很高大上一些不会让用户感觉错误很低级,非常不专业。
@ControllerAdvice是 Spring Framework 提供的一个强大注解,主要用于处理全局的异常处理。
全局拦截的错误例如
自定义错误,入参类型校验错误提示,数据库错误,托底的错误提示。
/**
* 全局异常处理
* Created by on 2020/2/27.
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
// 处理自定义异常
@ExceptionHandler(ApiException.class)
public ResponseEntity<GlobalException > handleResourceNotFoundException(ApiException e) {
log.error("自定义拦截");
log.error("资源未找到异常: {}", e.getMessage(), e);
GlobalException globalException= new GlobalException(e.getMessage(),HttpStatus.NOT_FOUND.value());
return ResponseEntity.status(503).body(globalException);
}
// 托底处理所有未处理的异常
@ExceptionHandler(Exception.class)
public ResponseEntity<GlobalException> handleGlobalException(Exception e) {
// 可以记录日志
log.error("全局兜底拦截");
log.error("系统错误: {}", e.getMessage(), e);
GlobalException globalException= new GlobalException(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR.value());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR.value()).body(globalException);
}
}
import org.springframework.http.ResponseEntity;
ResponseEntity中的status赋值会改变接口请求的状态码的改变,请求状态码会直接影响浏览器的调用。尤其有OPTIONS请求的浏览器。当预请求状态码不同的时候就不会有正式的请求了。
如果是自定义的返回形式好像还是会有其他的错误提示拦截去做处理。