统一异常处理

Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容。如下:

实现方式

通过@ControllerAdvice@ExceptionHandler实现处理controller层的异常

@ControllerAdvice
public class GlobalExceptionHandler {
    private Logger logger =
            LoggerFactory.getLogger(GlobalExceptionHandler.class);
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseData defaultErrorHandler(HttpServletRequest req, 
                                            Exception e) throws Exception {
        logger.error("", e);
        logger.error("in default exception handler");
        ResponseData r = new ResponseData();
        r.setMessage(e.getMessage());
        if (e instanceof org.springframework.web.servlet.NoHandlerFoundException){
            r.setCode(404);
        } else {
            r.setCode(500);
        }
        r.setData(null);
        r.setStatus(false);
        return r;
    }
    // NullPointerException会由该handler进行处理,即使之前有Exception Handler
    @ExceptionHandler(value = NullPointerException.class)
    @ResponseBody
    public ResponseData nullPointerErrorHandler(HttpServletRequest req, 
                                                Exception e) throws Exception {
        logger.error("", e);
        logger.error("in null pointer exception handler");
        ResponseData r = new ResponseData();
        r.setMessage(e.getMessage());
        r.setCode(500);
        r.setData(null);
        r.setStatus(false);
        return r;
    }
}
public class ResponseData {
    private Boolean status = true;
    private int code = 200;
    private String message;
    private Object data;
    // ...... 省略 get&set
}

ok测试一下

可以看到NullPointerException已经处理正确处理,但是404的错误并没有走统一异常处理,这个原因是404默认并不是抛出异常的,所以需要在application.properties中进行相关的设置。

# 出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
# 不要为我们工程中的资源文件建立映射
spring.resources.add-mappings=false

再测试下404错误

posted @ 2020-07-27 16:53  江舟  阅读(127)  评论(0)    收藏  举报