@RestControllerAdvice

举报
赵KK日常技术记录 发表于 2023/07/05 15:07:03 2023/07/05
1.1k+ 0 0
【摘要】 解决 Spring Boot 项目中 @RestControllerAdvice 全局异常失效问题在 Spring Boot 项目中,我们经常使用 @RestControllerAdvice 来全局处理异常。然而,在某些情况下,该注解可能会失效,导致异常无法被正确处理。本文将介绍如何解决 @RestControllerAdvice 全局异常失效的问题。 问题描述当我们在 Spring Boo...

解决 Spring Boot 项目中 @RestControllerAdvice 全局异常失效问题
在 Spring Boot 项目中,我们经常使用 @RestControllerAdvice 来全局处理异常。然而,在某些情况下,该注解可能会失效,导致异常无法被正确处理。本文将介绍如何解决 @RestControllerAdvice 全局异常失效的问题。

问题描述

当我们在 Spring Boot 项目中使用 @RestControllerAdvice 时,有时候会发现全局异常处理失效了。具体表现如下:

  1. 当前控制器中没有捕获到异常,而是直接将其抛出了。
  2. 其他控制器中的 @ExceptionHandler 方法也无法处理该异常。
    出现该问题的原因在于 @RestControllerAdvice 注解的优先级较低,当控制器中存在其他异常处理注解时,@RestControllerAdvice 注解将被覆盖。

解决方案

为了解决该问题,我们可以采取以下几种方案:

  1. 调整注解顺序
    @RestControllerAdvice 注解放在其他异常处理注解之前,以提高其优先级。例如:
@RestControllerAdvice  
@ExceptionHandler(value = Exception.class)  
public class GlobalExceptionHandler {  
   // 处理全局异常  
}
@Controller  
public class UserController {  
   @ExceptionHandler(value = UserException.class)  
   public ResponseEntity<Object> handleUserException(UserException ex) {  
       // 处理用户异常  
   }  
}
  1. 使用 @ControllerAdvice 注解
    在 Spring Boot 2.5 版本后,引入了 @ControllerAdvice 注解,该注解具有更高的优先级,可以覆盖 @RestControllerAdvice 注解。因此,我们可以考虑使用 @ControllerAdvice 注解来处理全局异常。例如:
@ControllerAdvice  
public class GlobalExceptionHandler {  
   // 处理全局异常  
}
@Controller  
public class UserController {  
   @ExceptionHandler(value = UserException.class)  
   public ResponseEntity<Object> handleUserException(UserException ex) {  
       // 处理用户异常  
   }  
}
  1. 使用拦截器
    除了使用注解方式处理异常外,我们还可以使用拦截器来实现异常处理。拦截器可以在请求处理之前或之后执行,因此可以更灵活地处理异常。例如:
@Component  
public class GlobalExceptionInterceptor implements HandlerInterceptor {  
   @Override  
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {  
       try {  
           // 调用处理器处理请求  
           return true;  
       } catch (Exception ex) {  
           // 处理全局异常  
           return false;  
       }  
   }
   @Override  
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  
                          Exception ex) {  
       // 处理完成后的逻辑  
   }  
}
@Configuration  
public class WebMvcConfig implements WebMvcConfigurer {  
   @Override  
   public void addInterceptors(InterceptorRegistry registry) {  
       registry.addInterceptor(new GlobalExceptionInterceptor());  
   }  
}

小结

在 Spring Boot 项目中,我们可以使用 @RestControllerAdvice@ControllerAdvice 注解以及拦截器来处理全局异常。在实际开发中,我们需要根据项目的需求和架构来选择合适的方案。通过本文的讲解,希望可以帮助大家更好地解决 Spring Boot 项目中 @RestControllerAdvice 全局异常失效的问题。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。