在Spring 3.2中,新增了@ControllerAdvice、@RestControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中
此注解是一个增强的 Controller。使用这个 Controller 可实现三个方面的功能:
- 全局异常处理 (@ExceptionHandler)
用于捕获Controller中抛出的不同类型的异常 - 全局数据绑定 (@InitBinder)
用于请求中注册自定义参数的解析 - 全局数据预处理 (@ModelAttribute)
此方法会在执行目标Controller方法之前执行
一个示例:
/**
* ControllerAdvice本质上是一个Component,因此也会被当成组建扫描
* ControllerAdvice 提供了多种指定Advice规则的定义方式,默认什么都不写,则是Advice所有Controller,当然你也可以通过下列的方式指定规则
* 比如对于 String[] value() default {} , 写成@ControllerAdvice("org.my.pkg") 或者 @ControllerAdvice(basePackages="org.my.pkg"), 则匹配org.my.pkg包及其子包下的所有Controller,当然也可以用数组的形式指定,如:@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"}), 也可以通过指定注解来匹配,比如我自定了一个 @CustomAnnotation 注解,我想匹配所有被这个注解修饰的 Controller, 可以这么写:@ControllerAdvice(annotations={CustomAnnotation.class})
*
**/
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* @description 异常处理 handler
* @param request request
* @param e 异常
* @author chang
* @date 2022/10/11 2:10 PM
* @return
**/
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
logger.error("Requst URL : {},Exception : {}", request.getRequestURL(),e);
/*
* 这里 Exception.class 标注为拦截所有异常,只是如果有使用 ResponseStatus 注解的方法抛出的异常
* 不进行跳转到错误页面,而是直接抛出异常
*/
if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class) != null) {
throw e;
}
ModelAndView mv = new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception", e);
mv.setViewName("error/error");
return mv;
}
}
参考:
网友评论