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)的更多相关文章

  1. Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 package com.agent.annotation; import java.lang.annot ...

  2. 获取调用者Class和method、反射获取get方法、获取注解信息

    调用者Class 及 method StackTraceElement stacks[] = Thread.currentThread().getStackTrace(); for (StackTra ...

  3. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号

    class Program { static void Main(string[] args) { Log("测试"); Console.Read(); } public stat ...

  4. 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息

    第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法   submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...

  5. AOP动态代理解析3-增强方法的获取

    对于指定bean的增强方法的获取一定是包含两个步骤的: 获取所有的增强 寻找所有增强中使用于bean的增强并应用 那么findCandidateAdvisors与findAdvisorsThatCan ...

  6. PHP获取项目所有控制器方法名称

    PHP获取项目所有控制器方法名称 //获取模块下所有的控制器和方法写入到权限表 public function initperm() { $modules = array('admin'); //模块 ...

  7. AOP中ProceedingJoinPoint获取目标方法,参数,注解

    private void saveLog(ProceedingJoinPoint jp,long time)throws Throwable { package com.cy.pj.common.as ...

  8. [Q]“获取AutoCAD安装信息时失败...”解决方法

    “获取AutoCAD安装信息时失败...”解决方法:在“setup.exe”上右键,以管理员权限运行即可.

  9. Android获取视频音频的时长的方法

    android当中获取视频音频的时长,我列举了三种. 1:获取视频URI后获取cursor cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore ...

  10. thinkphp5 查询的数据是对象时,获取原始数据方法

    获取原始数据 如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用: $user = User::get(1); // 通过获取器获取字段 echo $user->status; / ...

随机推荐

  1. 什么是 SpringMvc?

    SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合.

  2. 两个Excel表格核对 excel表格中# DIV/0 核对两个表格的差异,合并运算VS高级筛选

    两个Excel表格核对   excel表格中# DIV/0 核对两个表格的差异,合并运算VS高级筛选 1.两列顺序一样的数据核对 方法1:加一个辅助列,=B2=C2 结果为FALSE的就是不相同的 方 ...

  3. 解析Html Canvas的卓越性能与高效渲染策略

    一.什么是Canvas 想必学习前端的同学们对Canvas 都不陌生,它是 HTML5 新增的"画布"元素,可以使用JavaScript来绘制图形. Canvas元素是在HTML5 ...

  4. 有点儿神奇,原来vue3的setup语法糖中组件无需注册因为这个

    前言 众所周知,在vue2的时候使用一个vue组件要么全局注册,要么局部注册.但是在setup语法糖中直接将组件import导入无需注册就可以使用,你知道这是为什么呢?注:本文中使用的vue版本为3. ...

  5. 解决Vue中使用history路由模式出现404的问题

    背景 vue中默认的路由模式是hash,会出现烦人的符号#,如http://127.0.0.1/#/. 改为history模式可以解决这个问题,但是有一个坑是:强刷新.回退等操作会出现404. Vue ...

  6. 2020-2021 ICPC, NERC, Northern Eurasia Onsite BEIJ 题解

    B. Button lock 题意:有 \(d\) 个 01 按键以及一个 reset 按键,你需要把所有题目给定的 \(n\) 个密码全部表示一遍.只有按下 reset 按键后才能使所有 01 按键 ...

  7. Linux下命令行开启关闭触摸板

    Linux下命令行开启关闭触摸板 从设备列表中找到触摸板的设备id,调用xinput可以控制设备的开启关闭. 示例代码如下: #!/bin/bash device=`xinput list | gre ...

  8. python重拾第五天-常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  9. socket 端口复用 SO_REUSEPORT 与 SO_REUSEADDR

    背景 在学习 SO_REUSEADDR 地址复用的时候,看到有人提到了 SO_REUSEPORT .于是也了解了一下. SO_REUSEPORT 概述 SO_REUSEPOR这个socket选项可以让 ...

  10. Docker使用Dockerfile部署项目

    什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成镜像. 如何通过do ...