跳转至

Spring Boot 全局异常处理

约 110 个字 48 行代码 预计阅读时间 1 分钟

基本格式:

1
2
3
4
5
6
7
@RestControllerAdvice   // @ResponseBody 返回 JSON。如要返回视图、转发、重定向,用 @ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(异常类.class)
    public 返回值 处理方法名称(异常类 e) {
        ...
    }
}

如果没有写日志相关的代码,则不会输出日志。故应该同时加上输出日志。

具体异常的处理方法,优先级比上级的更高。如同时写了处理 NullPointerExceptionException 的方法,则遇到 NullPointerException 时,走前者流程。

要用处理 Exception 的方法兜底。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public BaseResponse<Object> handlerNullException(NullPointerException e){
        log.error("!!!NPE!!!", e);
        return BaseResponse.builder()
                .code(6855)
                .message("!!!NPE!!!")
                .data(
                        Arrays.stream(e.getStackTrace())
                                .map(StackTraceElement::toString)
                                .reduce((a, b) -> a + "\n" + b)
                                .orElse("")
                )
                .build();
    }

    @ExceptionHandler(Exception.class)
    public Object handlerException(Exception e){
        log.error("Error", e);
        return BaseResponse.builder()
                .code(1)
                .message("Error")
                .data(
                        Arrays.stream(e.getStackTrace())
                                .map(StackTraceElement::toString)
                                .reduce((a, b) -> a + "\n" + b)
                                .orElse("")
                )
                .build();
    }

}

在 Spring MVC 中,还要确保这个类能够被扫描到:

MvcConfig
1
2
3
4
5
6
@Configuration
@ComponentScan(basePackages = {"包名1", "包名2", ...})
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
    ...
}