SpringBoot项目中@RestControllerAdvice全局异常失效问题的解决

 更新时间:2024年11月01日 10:39:41   作者:Eric-x  
@RestController注解是一个用于定义RESTful Web服务的控制器的特殊注解,它是@Controller和@ResponseBody注解的结合体,意味着你不需要在每个处理请求的方法上都添加@ResponseBody,本文给大家介绍了解决SpringBoot项目中@RestControllerAdvice全局异常失效问题

1、问题

使用@RestControllerAdvice添加了全局异常,但没有生效

/**
 * 全局异常处理
 * @author Eric
 * @date 2022-10-08 10:00:22
 */
@RestControllerAdvice
public class ExceptionControllerAdvice {

    private static final Logger logger = LoggerFactory.getLogger(WxRedpackController.class);

    /**
     * 用来拦截valid的校验
     * @param e
     * @return
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Object handleVaildException(MethodArgumentNotValidException e) {
        logger.info("数据校验出现问题:{},异常类型:{}", e.getMessage(), e.getClass());
        BindingResult result = e.getBindingResult();
        if (result.hasErrors()) {
            Map<String, String> errorMap = new HashMap<>();
            result.getFieldErrors().forEach((item) -> {
                //获取到的错误提示
                String message = item.getDefaultMessage();
                //获取到的错误属性名称
                String field = item.getField();
                errorMap.put(field, message);
            });
            return ResponseUtil.fail(DATA_ERROR.code(),errorMap);
        }
        return ResponseUtil.fail();
    }


    /**
     * 拦截未知的运行时异常
     */
    @ExceptionHandler(RuntimeException.class)
    public Object notFount(RuntimeException e) {
        logger.info("运行时异常:", e);
        return ResponseUtil.fail(DATA_ERROR.code(),e.getMessage());
    }

    /**
     * 系统异常
     */
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        logger.info(e.getMessage(), e);
        return ResponseUtil.fail(DATA_ERROR.code(),"服务器网络拥堵,请稍后再试");
    }

}

2、解决

方式1:@ExceptionHandler 所在类没有被Spring管理

因为 @SpringbootApplication默认扫描本包和子包,为了防止 全局异常类未被扫描到,建议在启动类上加上包扫描

方式2:AOP process() 没有异常抛出,自然不会被拦截掉。检查项目中的切面编程,查看是否在某个切面将异常try-catch,然后没有扔出来。

方式3:在@RestControllerAdvice @ConrollerAdivce 所在的类使用@Order(999999),注意这里不要引用错误的包了了,org.springframework.core.annotation.Order

到此这篇关于SpringBoot项目中@RestControllerAdvice全局异常失效问题的解决的文章就介绍到这了,更多相关SpringBoot @RestController异常失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java Class文件内部结构解析过程详解

    java Class文件内部结构解析过程详解

    java class的文件结构,java class文件结构是基于字节流的,用unicode进行编码,下面说说java Class文件内部结构分析
    2013-11-11
  • JAVA WEB中Servlet和Servlet容器的区别

    JAVA WEB中Servlet和Servlet容器的区别

    这篇文章主要介绍了JAVA WEB中Servlet和Servlet容器的区别,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解Java MyBatis 插入数据库返回主键

    详解Java MyBatis 插入数据库返回主键

    这篇文章主要介绍了详解Java MyBatis 插入数据库返回主键,有兴趣的可以了解一下。
    2017-01-01
  • Java中的Cursor使用详解

    Java中的Cursor使用详解

    本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧
    2025-02-02
  • Java中==与equals的区别小结

    Java中==与equals的区别小结

    这篇文章主要介绍了Java中==与equals的区别小结,本文总结结论:== 与 equals()比较的内容是不同的,equals()方式是String类中的方法,它用于比较两个对象引用所指的内容是否相等,而 == 比较的是两个对象引用的地址是否相等,需要的朋友可以参考下
    2015-06-06
  • SpringBoot集成JWT生成token及校验方法过程解析

    SpringBoot集成JWT生成token及校验方法过程解析

    这篇文章主要介绍了SpringBoot集成JWT生成token及校验方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java lambda list转换map时,把多个参数拼接作为key操作

    Java lambda list转换map时,把多个参数拼接作为key操作

    这篇文章主要介绍了Java lambda list转换map时,把多个参数拼接作为key操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 详解Java编程规约(命名风格、常量定义、代码格式)

    详解Java编程规约(命名风格、常量定义、代码格式)

    这篇文章主要介绍了详解Java编程规约(命名风格、常量定义、代码格式),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-10-10
  • 详解Java使用JMH进行基准性能测试

    详解Java使用JMH进行基准性能测试

    本文主要介绍了Java使用JMH进行基准性能测试,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java解析使用JSON的多种方法

    Java解析使用JSON的多种方法

    使用JSON作为数据传输,在浏览器端非常方便。JSON去除了所有JavaScript执行代码,只保留对象格式,而且JSON天生适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。现在问题来了:使用Java如何对JSON进行读写?
    2022-12-12

最新评论