摘要:在 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 统一异常处理和获取方法名的更多相关文章

  1. Spring MVC的Controller统一异常处理:HandlerExceptionResolver

    a.针对500异常的统一处理1.实现HandlerExceptionResolver,重写resolveException方法 package com.liying.mango.common.inte ...

  2. js中获取方法名

    var tmp = arguments.callee.toString(); var re = /function\s*(\w*)/i; var matches = re.exec(tmp);//方法 ...

  3. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  4. Spring Boot2从入门到实战:统一异常处理

    都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...

  5. spring注解版

    第一.spring框架快速入门 1.1什么是spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of C ...

  6. spring 注解 之 AOP基于@Aspect的AOP配置

    Spring AOP面向切面编程,可以用来配置事务.做日志.权限验证.在用户请求时做一些处理等等.用@Aspect做一个切面,就可以直接实现. 1.首先定义一个切面类,加上@Component  @A ...

  7. Java中获取运行代码的类名、方法名

    以下是案例,已运行通过 package com.hdys; /* * 1.获取当前运行代码的类名,方法名,主要是通过java.lang.StackTraceElement类 * * 2. * [1]获 ...

  8. spring mvc统一异常处理(@ControllerAdvice + @ExceptionHandler)

    spring 封装了非常强大的异常处理机制.本文选取@ControllerAdvice + @ExceptionHandler 这种零配置(全注解),作为异常处理解决方案! @ControllerAd ...

  9. 使用Spring MVC统一异常处理实战

    1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合 ...

  10. 【统一异常处理】@ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常

    1.利用springmvc注解对Controller层异常全局处理 对于与数据库相关的 Spring MVC 项目,我们通常会把 事务 配置在 Service层,当数据库操作失败时让 Service ...

随机推荐

  1. P3498 [POI2010]KOR-Beads 题解

    前言: 最近在做哈希的题,发现了这道好题,看题解里很多大佬的方法都很巧妙,自己就发一个较为朴素的方法吧. 题意: 题目传送门 给你一个序列,需要求出数 k,使划分的子串长度为 k 时,不同的子串数量最 ...

  2. debug.exe的使用

    debug.exe的使用 debug.exe 是 Windows 操作系统自带的一个命令行调试工具,用于在 DOS 环境下进行汇编语言级别的调试操作.它可以让程序员以来自底层的方式逐步执行代码并检查每 ...

  3. 22.04.1 wine8.10 完美安装同花顺最新版THS_9.20.40_20230613

    Linux luma 5.19.0-45-generic #46~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 15:06:04 UTC 20 x86_64 ...

  4. LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读

    LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 论文阅读 KDD 2023 原文 ...

  5. 【HTML】Echart图表

    layui-echarts 简介 基于layui 实现的 echart 图表 Echart 官网 示例 Echart示例 下载Echart Echart下载 我们选择最下面的在线定制 我这里就按照它默 ...

  6. 即构SDK5月迭代:新增声道选择、网络探测、智能消噪等功能,打造更优的视听体验

    即构SDK5月份的迭代更新如期而至,本月互动视频(LiveRoom).实时语音(AudioRoom)两大SDK以及录制插件(PlayRecord)均有新功能上线.新增的声道选择.变调控制.智能消噪.枚 ...

  7. Codeforces Round #875 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  8. Java并发工具CountDownLatch的使用和原理

    1.等待多线程完成的 CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作. 假如有这样一个需求:我们需要解析一个 Excel 里多个 sheet 的数据 ...

  9. python 镜像

    https://pypi.douban.com/simple/   豆瓣源 pip install -i https://pypi.douban.com/simple/ pymysql # pymys ...

  10. VS Code 有哪些好用的插件呢?【持续更新】

    一.画图工具:vscode-drawio   功能:在 VSCode 中画流程图.数据流图等等.        使用方法:     创建一个后缀名为 .drawio 的文件,然后用 VSCode 打开 ...