@ControllerAdvice + @ExceptionHandler全局处理Controller层异常
欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
前言
Service抛出运行时异常时,我们的Controller层就不得不进行
try-catch
处理Service层的异常,否则会返回一些不友好的错误信息到客户端。但是,Controller层每个方法体都写一些模板化的try-catch的代码,很难看也难维护,特别是还需要对Service层的不同异常进行不同处理的时候。
1.简介
优点:将 Controller层的异常和数据校验的异常进行统一处理,减少模板代码,减少编码量,提升扩展性和可维护性。
缺点:只能处理Controller层未捕获(往外抛)的异常,对于 Interceptor(拦截器)层的异常,Spring 框架层的异常,就无能为力了。
@ControllerAdvice
是Controller的一个辅助类,用法基本是将其声明在某个bean上,然后在该bean的方法上使用其他的注解来指定不同的织入逻辑。@ExceptionHandler
的作用主要在于声明一个或多个类型的异常,当符合条件的Controller抛出这些异常之后将会对这些异常进行捕获,然后按照其标注的方法的逻辑进行处理,从而改变返回的视图信息。
2.基本使用
@ControllerAdvice(basePackages = "sell")
public class SpringControllerAdvice {
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.FORBIDDEN) //设置状态码
public ModelAndView runtimeException(RuntimeException e) {
e.printStackTrace();
return new ModelAndView("common/error");
}
}