全局统一异常
    使用 @RestControllerAdvice
    ,捕获异常后统一返回封装好的格式。
    异常分成两种:已知异常与未知异常,未知异常是着重需要关注的,所以会将未知异常入库,方便排查
    以下为全局异常核心代码

    1. @Slf4j
    2. @Configuration
    3. // 判断在 classpath 中是否存在 Servlet DispatcherServlet类
    4. // 如果存在,则匹配 @Conditional 注解,创建 Servlet DispatcherServlet类 实例
    5. @ConditionalOnClass({Servlet.class, DispatcherServlet.class})
    6. //@ConditionalOnWebApplication主要的用处是: 当Spring为web服务时,才使注解的类生效;通常是配置类;
    7. //只有运行在 web 应用里才会加载这个 bean
    8. @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @RestControllerAdvice
    9. public class BladeRestExceptionTranslator {
    10. @ExceptionHandler(MissingServletRequestParameterException.class)
    11. public R handleError(MissingServletRequestParameterException e) {
    12. log.warn("缺少请求参数", e.getMessage());
    13. String message = String.format("缺少必要的请求参数: %s", e.getParameterName() );
    14. return R.failure(ResultCode.PARAM_MISS, message);
    15. }

    @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来自定义界面处理异常;