如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)
1.背景
很多时候我们在梳理公共异常时,需要获取到接口的而具体名称,便于很好的提示是那个接口错误了
2.实现逻辑
1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名称;
2.使用aop通过JoinPoint,使用反射拿到注解上的方法名称;
3.把方法名称放到ThreadLocal里面;
4.在公用异常处理的地方从ThreadLocal里面获取到方法名称;
...搞定!
3.具体代码
1.在controller方法上的注解上写方法名称,一般使用了swagger都有方法名称;

2.使用aop通过JoinPoint,使用反射拿到注解上的方法名称;
/**
* @Description 获取注解中对方法的描述信息 用于Controller层注解
*/
public static String getControllerMethodDescription(JoinPoint joinPoint) throws ClassNotFoundException {
String description = "";
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();//目标方法名
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
// 获取类上的注解
Annotation annotation1 = targetClass.getAnnotation(Api.class);
if (annotation1 != null) {
String[] tags = ((Api) annotation1).tags();
for (String tag : tags) {
description += tag;
}
}
// 获取方法上的注解
Method[] methods = targetClass.getMethods();
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
ApiOperation annotation = method.getAnnotation(ApiOperation.class);
description += annotation == null ? "未命名接口" : annotation.value();
break;
}
}
}
return description;
}
3.把方法名称放到ThreadLocal里面;
调用set方法即可
public class ThreadLocalUtil {
private static ThreadLocal<String> localVar = new ThreadLocal<>();
public static void set(String name) {
localVar.set(name);
}
public static String get() {
String s = localVar.get();
localVar.remove();
return s;
}
public static void remove() {
localVar.remove();
}
}
4.在公用异常处理的地方从ThreadLocal里面获取到方法名称;

完美!
如何在通用异常处理时获取到方法名称(获取注解参数JoinPoint)的更多相关文章
- Spring:使用Spring AOP时,如何获取目标方法上的注解
当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 package com.agent.annotation; import java.lang.annot ...
- 获取调用者Class和method、反射获取get方法、获取注解信息
调用者Class 及 method StackTraceElement stacks[] = Thread.currentThread().getStackTrace(); for (StackTra ...
- C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
class Program { static void Main(string[] args) { Log("测试"); Console.Read(); } public stat ...
- 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息
第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...
- AOP动态代理解析3-增强方法的获取
对于指定bean的增强方法的获取一定是包含两个步骤的: 获取所有的增强 寻找所有增强中使用于bean的增强并应用 那么findCandidateAdvisors与findAdvisorsThatCan ...
- PHP获取项目所有控制器方法名称
PHP获取项目所有控制器方法名称 //获取模块下所有的控制器和方法写入到权限表 public function initperm() { $modules = array('admin'); //模块 ...
- AOP中ProceedingJoinPoint获取目标方法,参数,注解
private void saveLog(ProceedingJoinPoint jp,long time)throws Throwable { package com.cy.pj.common.as ...
- [Q]“获取AutoCAD安装信息时失败...”解决方法
“获取AutoCAD安装信息时失败...”解决方法:在“setup.exe”上右键,以管理员权限运行即可.
- Android获取视频音频的时长的方法
android当中获取视频音频的时长,我列举了三种. 1:获取视频URI后获取cursor cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore ...
- thinkphp5 查询的数据是对象时,获取原始数据方法
获取原始数据 如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用: $user = User::get(1); // 通过获取器获取字段 echo $user->status; / ...
随机推荐
- 升级babel7后,直接引用element-ui中没有暴露出来的组件image-viewer.vue导致的打包错误
问题 & 解决方案 升级babel7后,原先代码中像这样直接引用element-ui组件的地方,出现了报错 Module parse failed: Unexpected token (1:0 ...
- 【前端求助帖】关于使用element-plus select 模板嵌套popover中使用select选择后,上一个select自动关闭的问题
主页代码如下 项目使用的是Vue3+vite, 下载后,直接pnpm i安装依赖, pnpm dev 就是可以跑起来 <el-button type="warning" ...
- JSR303数据校验使用方法记录
JSR303并不对应着指定的jar包,而是一种规范,目前hibernate-validator是使用最多的是基于JSR303规范的实现 本文不适合新人观看,要求至少要知道使用方法 Springboot ...
- JSON文件存储
JSON 文件存储 JSON,全称为 JavaScript Object Notation, 也就是 JavaScript 对象标记,通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一 ...
- 使用Kubesec检查YAML文件安全
目录 一.系统环境 二.前言 三.Kubesec简介 四.使用Kubesec检查YAML文件安全 五.总结 一.系统环境 本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu ...
- 使用定时器:在logs目录,每两分钟产生一个文件
1.使用定时器:在logs目录,每两分钟产生一个文件(文件格式为:201711151323.log.201711151323.log.2017111513xx.log ...思路:定时器定时调用she ...
- npm基本操作手册
查看npm版本 npm -v 设置仓库地址 # 默认仓库地址 npm config set registry https://registry.npmjs.org/ # 淘宝镜像地址 npm conf ...
- 网易数帆内核团队:memory cgroup 泄漏问题的分析与解决
memory cgroup 泄露是 K8s(Kubernetes) 集群中普遍存在的问题,轻则导致节点内存资源紧张,重则导致节点无响应只能重启服务器恢复:大多数的开发人员会采用定期 drop cach ...
- vue3+elementplus 去除小数点后多余的0公用函数
vue3+elementplus 去除小数点后多余的0公用函数 export function removeTrailingZeros(value) { // 尝试将值转换为数字 const nume ...
- [oeasy]python0068_控制序列_清屏_控制输出位置_2J
光标位置 回忆上次内容 上次了解了键盘演化的过程 ESC 从 组合键 到 独立按键 ESC 的目的 是进入控制序列 配置控制信息 控制信息 \033[y;xH 设置光标位置 \033[2J 清屏 这到 ...