欢迎fork star 本人开源项目
本文介绍的所有代码均再码云中,如果对你有帮助,欢迎点个star支持,谢谢
区别于SpringBoot 1.x的全局异常
在项目早期,使用的SpringBoot1.5.8,那时处理全局异常
@ControllerAdvice("com.angel.bo")
@RestController
@Slf4j
public class GlobalExceptionHandler implements ErrorController {
并在方法上使用@ExceptionHandler注解来处理系统异常
@ExceptionHandler(Exception.class)
public WebReturn handle(Exception e, HttpServletResponse response) {
response.setStatus(HttpStatus.OK.value());
e.printStackTrace();
并且映射/error路径,处理所有/error的异常
/**
* <p>
* 方法说明:本方法处理除了500之外的所有异常,
* 注意405错误是被ExceptionHandler转发调用的
*/
@RequestMapping(ERROR_PATH)
public WebReturn handle(HttpServletResponse response) {
WebReturn baseResponse = null;
如果你的项目是SpringBoot1.5x,那基本使用上面的就可以处理所有异常,并且都是JSON格式返回的
SpringBoot2.x的全局异常处理
在年初升级项目到SpringBoot 2.x的时候,继续使用第一版代码时出现问题。迁移过程请参考本人早起的博客
SpringBoot2统一处理异常包括404异常 虽然能处理,但觉得并不完美,可能会有问题,参考时请慎重
处理/error的异常
重写 /error 需要实现接口ErrorController
@RestController
@Slf4j
@SuppressWarnings("all")
public class NotFoundException implements ErrorController {
private static final String PATH = "/error";
@RequestMapping(PATH)
public WebReturn handle(HttpServletResponse response) {
WebReturn baseResponse = null;
log.error("GlobalExceptionHandler中捕获除了500之外的所有状态码: {}" , response.getStatus());
baseResponse = new WebReturn(ReturnCodeEnum.REQUEST_ERROR);
//欺骗性质的各种问题均转化为状态置为200
response.setStatus(HttpStatus.OK.value());
return baseResponse;
}
@Override
public String getErrorPath() {
return PATH;
}
}
参考我的工程代码
https://gitee.com/imbobo_bo/angel-bo/tree/v4.0/ao-be-common/src/main/java/com/ao/be/common
因为我把这个代码写在了common包下,所以在加载的时候需要指明
@Bean
public NotFoundException getNotFoundException(){
return new NotFoundException();
}
如果这时启动项目会出现异常
to {[/error]}: There is already 'basicErrorController' bean method
因为SpringBoot在启动时,会加载ErrorMvcAutoConfiguration类中的配置
会加载BasicErrorController中的/error映射
@Bean
@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
public BasicErrorController basicErrorController(ErrorAttributes errorAttributes) {
return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
this.errorViewResolvers);
}
所以在初始化时,先指明加载NotFoundException在ErrorMvcAutoConfiguration类中的配置之前
@AutoConfigureBefore(ErrorMvcAutoConfiguration.class)
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@AutoConfigureBefore(ErrorMvcAutoConfiguration.class)
public class AutoConfiguration {
@Bean
public NotFoundException getNotFoundException(){
return new NotFoundException();
}