Spring Boot 全局异常处理
约 110 个字 48 行代码 预计阅读时间 1 分钟
基本格式:
| @RestControllerAdvice // @ResponseBody 返回 JSON。如要返回视图、转发、重定向,用 @ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(异常类.class)
public 返回值 处理方法名称(异常类 e) {
...
}
}
|
如果没有写日志相关的代码,则不会输出日志。故应该同时加上输出日志。
具体异常的处理方法,优先级比上级的更高。如同时写了处理 NullPointerException
和 Exception
的方法,则遇到 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 |
---|
| @Configuration
@ComponentScan(basePackages = {"包名1", "包名2", ...})
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
...
}
|