Spring @ExceptionHandler注解统一异常处理和获取方法名

 更新时间:2023年09月25日 09:03:22   作者:楼兰胡杨  
这篇文章主要介绍了Spring注解之@ExceptionHandler 统一异常处理和获取方法名,在实际项目中,合理使用@ExceptionHandler能够提高代码的可维护性和用户体验,通过本文的解析和实践,读者可以更好地理解和掌握@ExceptionHandler的用法和原理

摘要:

在 Spring Boot 中,使用Spring注解@ControllerAdvice 和 @ExceptionHandler 统一处理异常,并捕获方法名,从而快速定位错误原因。

背景分析

  最近走查线上环境日志时,发现打印了很多org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported异常日志,虽然知道是因为接口不支持GET请求导致的,但是,定位不到是因为错误调用哪个接口导致,给人很大困惑。

@ExceptionHandler介绍

  异常处理器@ExceptionHandler是Spring MVC框架中用于处理异常的注解,方法名按需自定义,方法参数可以是Exception及其子类对象、HttpServletRequest、HttpServletResponse等,系统会自动为它们赋值。方法返回值类型可以为ModelAndView、Model、Map、View、String以及void等。它的作用是把各个Controller中抛出的异常集中到一个类中处理。

  在被@ControllerAdvice或者@RestControllerAdvice修饰的类里,可以使用@ExceptionHandler捕捉异常,返回值类型为Map的示例如下:

@Slf4j
@RestControllerAdvice
public class GlobalExceptionAdvice {
	/*
   * 捕捉HTTP请求方式异常HttpRequestMethodNotSupportedException
   */
   @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
   public Map<String, Object> handleBadMethodException(HttpRequestMethodNotSupportedException exception, HttpServletRequest req) {
       log.error("不支持的请求方式:{}-{}", req.getRequestURI(), exception.getMessage());
       Map<String, Object> result=new HashMap();
       result.put("msg","不支持的请求方式");
       result.put("code", HttpStatus.METHOD_NOT_ALLOWED.value());
       return result;
   }
}

  @RestControllerAdvice:放在类的上面,表示这个类中有异常处理器,它是基于AOP的、对控制器类的一个增强。

  req.getRequestURI()用于获取当前API访问路径的URI,里面包含方法名,用于快速定位是哪个API出错。

  在上述异常处理器示例中,当控制层抛出HttpRequestMethodNotSupportedException异常时,handleBadMethodException方法会被调用,返回一个包含错误信息的Map对象。如果把@ExceptionHandler(HttpRequestMethodNotSupportedException.class)改为@ExceptionHandler(Exception.class),则是处理全局异常了,会捕获所有未被其它方法处理的异常,这样处理的缺点是异常太过宽泛,不利于排查问题。

  验证功能的方法很简单,请使用GET请求访问仅支持POST请求的函数,此时,控制台将打印如下信息:

不支持的请求方式:/wiener/XXXMethod-Request method 'GET' not supported

结束语

  Spring MVC的@ExceptionHandler注解为Web应用程序提供了便捷的异常处理机制。通过使用该注解,可以在控制器中捕获和处理特定类型的异常,提供友好的错误信息给用户。在实际项目中,合理使用@ExceptionHandler能够提高代码的可维护性和用户体验。通过本文的解析和实践,读者可以更好地理解和掌握@ExceptionHandler的用法和原理。

到此这篇关于Spring注解之@ExceptionHandler 统一异常处理和获取方法名的文章就介绍到这了,更多相关Spring @ExceptionHandler 统一异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot整合AOP和redis的示例详解

    Springboot整合AOP和redis的示例详解

    本文主要介绍了Springboot整合AOP和Redis的详细过程,包括AOP的依赖引入和默认配置属性,日志切面格式以及Redis的自动配置和连接池使用,总结了在多线程环境下,选择合适的连接方式和客户端是非常重要,感兴趣的朋友一起看看吧
    2024-11-11
  • mybatisPlus批量插入优化加快性能

    mybatisPlus批量插入优化加快性能

    这篇文章主要介绍了mybatisPlus批量插入优化加快性能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • Java中多线程的ABA场景问题分析

    Java中多线程的ABA场景问题分析

    这篇文章主要为大家介绍了Java中多线程的ABA场景问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • springboot之使用logback日志框架的图文教程

    springboot之使用logback日志框架的图文教程

    这篇文章主要介绍了springboot之使用logback日志框架的图文教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • maven中profile的使用

    maven中profile的使用

    本文主要介绍了maven中profile的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java Map接口及其实现类原理解析

    Java Map接口及其实现类原理解析

    这篇文章主要介绍了Java Map接口及其实现类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java正则表达式判断 ip 地址是否正确解析

    java正则表达式判断 ip 地址是否正确解析

    这篇文章主要介绍了java正则表达式判断 ip 地址是否正确解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java 实现文件批量重命名亲测可用(精简版)

    Java 实现文件批量重命名亲测可用(精简版)

    本文给大家分享一段自己写的java代码实现文件批量重命名,亲测试过没有任何问题,大家可以放心使用
    2016-11-11
  • Java Date类常用示例_动力节点Java学院整理

    Java Date类常用示例_动力节点Java学院整理

    在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用,需要的朋友可以参考下
    2017-05-05
  • java实现事件委托模式的实例详解

    java实现事件委托模式的实例详解

    这篇文章主要介绍了java实现事件委托模式的实例详解的相关资料,这里提供实例来说明如何实现改功能,希望能帮助到大家理解这样的模式,需要的朋友可以参考下
    2017-08-08

最新评论