SpringBoot1.5.x 升级 SpringBoot2.x 全局异常处理[处理404 500] 重写/error

欢迎fork star 本人开源项目

本文介绍的所有代码均再码云中,如果对你有帮助,欢迎点个star支持,谢谢

star fork

区别于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();
    }

转载于:https://my.oschina.net/angelbo/blog/3066480

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值