springboot 除了@ControllerAdvice 异常拦截器之外还有其他的注解吗
时间: 2023-03-03 12:54:08 浏览: 65
是的,还有@ExceptionHandler注解,它可以捕获在控制器中抛出的异常,@RestControllerAdvice注解,它可以用来拦截特定的异常,以及@ControllerAdvice注解,它可以用来处理所有控制器中抛出的异常。
相关问题
Spring Boot 系列 - @ControllerAdvice & 拦截异常并统一处理
@ControllerAdvice 是 Spring MVC 提供的注解,用于统一处理 Controller 层抛出的异常。通过 @ControllerAdvice 注解,可以将对于控制器的全局配置放在同一个位置。而不是在每个 Controller 中逐个定义。
以下是使用 @ControllerAdvice 进行全局异常处理的示例代码:
```java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName("error");
return mav;
}
}
```
在上述代码中,@ExceptionHandler 注解用来指定处理哪种异常类型,这里我们处理的是 Exception 类型的异常,也就是所有异常类型的父类。defaultErrorHandler 方法用来处理异常,将异常信息添加到 ModelAndView 中,然后返回一个错误页面。
在实际项目中,我们可以根据实际需求进行定制化的异常处理。比如在返回 JSON 数据时,可以返回一个固定格式的错误信息,而不是返回一个错误页面。
总之,@ControllerAdvice 注解可以帮助我们统一处理控制器层抛出的异常,提升代码的可读性和可维护性。
@ControllerAdvice拦截接口没有拦截手动抛出异常
如果使用@ControllerAdvice注解拦截接口时,没有拦截到手动抛出的异常,可能是以下原因:
1. 异常类型不匹配:@ControllerAdvice通常是根据异常类型来拦截异常的,如果手动抛出的异常类型与拦截的异常类型不匹配,就不会被拦截。可以尝试在@ControllerAdvice注解中添加拦截的异常类型,例如:
```
@ControllerAdvice(Exception.class)
public class GlobalExceptionHandler {
// ...
}
```
2. 异常未被捕获:如果手动抛出异常时,没有被try-catch语句捕获,而是直接抛出到调用栈上,就不会被@ControllerAdvice拦截。可以尝试在抛出异常的方法上添加throws声明,或者在调用该方法时使用try-catch语句捕获异常。
3. 拦截器顺序问题:如果项目中使用了多个拦截器,可能存在拦截器顺序问题,导致@ControllerAdvice无法拦截异常。可以尝试在拦截器中调整拦截器的顺序,或者在@ControllerAdvice注解中添加优先级,例如:
```
@ControllerAdvice(priority = 1)
public class GlobalExceptionHandler {
// ...
}
```
4. 拦截器未激活:如果没有激活拦截器,@ControllerAdvice也无法拦截异常。可以尝试在配置文件中激活拦截器,例如:
```
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
```
总之,如果使用@ControllerAdvice注解拦截接口时,没有拦截到手动抛出的异常,可以从异常类型、异常捕获、拦截器顺序和拦截器激活等方面进行排查。