侧边栏壁纸
  • 累计撰写 98 篇文章
  • 累计创建 85 个标签
  • 累计收到 9 条评论

springboot配置全局异常不生效的问题

bearjun
2021-07-29 / 0 评论 / 0 点赞 / 544 阅读 / 1,923 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-07-29,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

背景

最近忙着新的项目的整合工作,配置了一个全局异常,但是好像没有生效,一直报的错误还是springboot自带的异常。
05069-t35nzeq08tp.png

问题发现

通过对全局异常的类实现InitializingBean初始化方法,但是springboot项目在启动的时候,控制台并没有打印任何初始化内容。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler implements InitializingBean{

    @ExceptionHandler(value = {RuntimeException.class})
    @ResponseBody
    public CommonResult runtimeExceptionHandle(RuntimeException exception) {
        return CommonResult.failed(CommonCode.FAILED, exception.getMessage());
    }

    
    @Override
    public void afterPropertiesSet(){
        log.info("-----------全局异常初始化------------");
    }
}

92738-g03jao9yr9c.png

问题解决

  • 在启动类上加入一个@Import注解,里面的内容是全局异常的class
@SpringBootApplication
@MapperScan(basePackages = "com.jianyitong.springcloud.protal.mapper")
@EnableSwagger2
@Import({GlobalExceptionHandler.class})
public class JianyitongProtalApplication {

    public static void main(String[] args) {
        SpringApplication.run(JianyitongProtalApplication.class, args);
    }

}

83278-1xc2m1yo2bnh.png

  • 在@SpringBootApplication注解中加入scanBasePackages用于扫描全局异常
@SpringBootApplication(scanBasePackages = {"com.jianyitong.springcloud"})
@MapperScan(basePackages = "com.jianyitong.springcloud.protal.mapper")
@EnableSwagger2
//@Import({GlobalExceptionHandler.class})
public class JianyitongProtalApplication {

    public static void main(String[] args) {
        SpringApplication.run(JianyitongProtalApplication.class, args);
    }

}

83278-1xc2m1yo2bnh.png

扩展:如何定义全局异常

其实定义全局异常非常简单,就是在一个类上加入@ControllerAdvice注解。然后在方法上加入@ExceptionHandler用于捕获需要捕获的异常。

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler implements InitializingBean{

    @ExceptionHandler(value = {RuntimeException.class})
    @ResponseBody
    public CommonResult runtimeExceptionHandle(RuntimeException exception) {
        return CommonResult.failed(CommonCode.FAILED, exception.getMessage());
    }

    
    @Override
    public void afterPropertiesSet(){
        log.info("-----------全局异常初始化------------");
    }
}

例如上面的实例,@RestControllerAdvice = @ControllerAdvice + @ResponseBody。上面的方法用户捕获RuntimeException的异常。这样一个全局异常就定义好了,如果需要多个,可以在value中写多个异常。

那定义全局异常的好处是什么呢?

  1. 优雅的定义全局异常,可以避免前后端对接的冲突。
  2. 业务层只关注业务,无需捕获,更关注业务。
  3. 简洁捕获异常的代码,使代码更简洁。
0

评论区