全局统一异常
使用 @RestControllerAdvice
,捕获异常后统一返回封装好的格式。
异常分成两种:已知异常与未知异常,未知异常是着重需要关注的,所以会将未知异常入库,方便排查
以下为全局异常核心代码
@Slf4j
@Configuration
// 判断在 classpath 中是否存在 Servlet DispatcherServlet类
// 如果存在,则匹配 @Conditional 注解,创建 Servlet DispatcherServlet类 实例
@ConditionalOnClass({Servlet.class, DispatcherServlet.class})
//@ConditionalOnWebApplication主要的用处是: 当Spring为web服务时,才使注解的类生效;通常是配置类;
//只有运行在 web 应用里才会加载这个 bean
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @RestControllerAdvice
public class BladeRestExceptionTranslator {
@ExceptionHandler(MissingServletRequestParameterException.class)
public R handleError(MissingServletRequestParameterException e) {
log.warn("缺少请求参数", e.getMessage());
String message = String.format("缺少必要的请求参数: %s", e.getParameterName() );
return R.failure(ResultCode.PARAM_MISS, message);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
作用一 修改状态码 就把@ResponseStatus 当做一个用来改变响应状态码的方式!
不管哪种方式,@ReponseStatus最后都是通过response.setStatus或response.sendError来处理.
如果只是为了返回状态码,建议只使用 @ResponseStatus(code=xxxx)这样来设置响应状态码;
如果抛出异常呢,不建议@ControllerAdvice里面的 @ResponseStatus和 自定义异常上的 @ResponseStatus一起使用, 按照我的阅读理解,两个一起使用肯定是一个生效,而且是 @ControllerAdvice中的@ResponseStatus生效.
场景分析:假设抛出异常不是我们自定义的异常,我们想改变响应的状态码,通过@ExceptionHandler来处理异常,并在@ExceptionHandler方法上也可以设置@ResponseStatus来达到效果;
假如抛出自定义的异常,自己没有定义异常处理界面,那在异常上标注@ResponseStatus就可以走 服务器默认的界面展示,或者通过web.xml 配置error-code \ error-page来自定义界面处理异常;