Spring 全局异常捕获

引言

前后端分离开发,后台有时候会出现不可预知的异常(运行时异常),在实际生产中通常需要统一返回符合一定响应结构的异常信息给前端,这一方面可以避免用户看到后台的报错信息,一方面也是保护后端程序免受恶意用户的试探。

简单总结一个Spring框架下的全局异常捕获的实现方式——@RestControllerAdvice。

一、代码演示

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

/**
 * 统一异常捕获类
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public CommonResp runtimeExceptionProcess(Exception e) {
        log.error("统一异常捕获:{}", e.getMessage());
        e.printStackTrace();
        CommonResp resp = new CommonResp("9999", "服务器异常!");
        log.info("统一异常响应:{}", resp);
        return resp;
    }
}

二、@RestControllerAdvice

Advice在AOP编程中代表了切面的执行逻辑,相当于 OOP 中的方法。

@RestControllerAdvice 是 Spring 3.2引入的一个协助 Controller 层织入切面逻辑的AOP注解,标记类上,类似的注解还有@ControllerAdvice。二者的区别是前者只用于基于REST API风格的 JSON响应结果的controller,简单的说,@ControllerAdvice + @ResponseBody = @RestControllerAdvice 。

@ControllerAdvice
public class MyControllerAdvice {
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception ex) {
        // 异常处理逻辑
        return map;
    }
}

三、ResponseEntityExceptionHandler

ResponseEntityExceptionHandler 包装了各种Spring MVC在处理请求时可能抛出各类异常的处理,通过对该类的继承,我们可以重写对应的处理逻辑。

比如,我们可以通过继承该类,在我们的@RestControllerAdvice 类中重写 handleBindException(..) 方法,来处理数据绑定的异常信息。

当然,第一节中的代码案例其实并不需要继承  ResponseEntityExceptionHandler ,但也可以作为一种附加参考,方便以后对特定异常进行扩展,当然也可以自定义异常来处理。

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页