背景
最近忙着新的项目的整合工作,配置了一个全局异常,但是好像没有生效,一直报的错误还是springboot自带的异常。
问题发现
通过对全局异常的类实现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("-----------全局异常初始化------------");
}
}
问题解决
- 在启动类上加入一个@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);
}
}
- 在@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);
}
}
扩展:如何定义全局异常
其实定义全局异常非常简单,就是在一个类上加入@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中写多个异常。
那定义全局异常的好处是什么呢?
- 优雅的定义全局异常,可以避免前后端对接的冲突。
- 业务层只关注业务,无需捕获,更关注业务。
- 简洁捕获异常的代码,使代码更简洁。
评论区