SpringBoot项目中统计所有Controller中的方法

2023-11-09

对接口方法进行抽象 

@Data
public class ControllerMethodItem {
	public String controllerName;
    public String methodName;
    public String requestType;
    public String requestUrl;
    public Class<?>[] methodParmaTypes;    
    
    public RequestToMethodItem(String requestUrl, String requestType, String controllerName, String requestMethodName, Class<?>[] methodParmaTypes){
        this.requestUrl = requestUrl;
        this.requestType = requestType;
        this.controllerName = controllerName;
        this.methodName = requestMethodName;
        this.methodParmaTypes = methodParmaTypes;
    }
}

获取Controller类型的Bean

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Description:
 * @Author be.insighted
 * @Date 2022/5/7 12:09
 */
@RestController
@Slf4j
public class ListAllMethodController {
    @Autowired
    private WebApplicationContext applicationContext;

    @GetMapping("list/all/methods")
    public Ret getAllUrl() {
        RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
        // 获取url与类和方法的对应信息
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();

        List<Map<String, String>> list = new ArrayList<>();
        for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) {
            Map<String, String> map1 = new HashMap<>();
            RequestMappingInfo info = m.getKey();
            HandlerMethod method = m.getValue();
            //获取当前方法所在类名
            Class<?> bean = method.getBeanType();
            log.info("当前类名称:{}, 精简名称:{}", bean.toString(), bean.toString().substring(bean.toString().lastIndexOf(".") + 1));
            //使用反射获取当前类注解内容
            Api api = bean.getAnnotation(Api.class);
            log.info("api: {}", api == null ? "没有类相关描述" : api);
            RequestMapping requestMapping = bean.getAnnotation(RequestMapping.class);

            Annotation[] annotations = bean.getAnnotations();
            for (Annotation a : annotations) {
                log.info("注解全称: {}", a);
            }
            if (requestMapping != null) {
                String[] value = requestMapping.value();
                map1.put("parent", value[0]);
            }
            //获取方法上注解以及注解值
            ApiOperation methodAnnotation = method.getMethodAnnotation(ApiOperation.class);
            if (methodAnnotation != null) {
                String notes = methodAnnotation.notes();
                log.info("注释: {}", notes);
            } else {
                log.info("当前方法没有相关注释");
            }
            PatternsRequestCondition p = info.getPatternsCondition();
            for (String url : p.getPatterns()) {
                map1.put("url", url);
            }
            map1.put("className", method.getMethod().getDeclaringClass().getName()); // 类名
            map1.put("method", method.getMethod().getName()); // 方法名
            RequestMethodsRequestCondition methodsCondition = info.getMethodsCondition();
            for (RequestMethod requestMethod : methodsCondition.getMethods()) {
                map1.put("type", requestMethod.toString());
            }

            list.add(map1);
        }
        return Ret.success(list);
    }
}
{
  "code": 0,
  "message": "请求成功!",
  "data": [
    {
      "method": "saveLeaseUseRange",
      "className": "com.hkwl.hkboot.smp.controller.LeaseUseRangeController",
      "type": "POST",
      "url": "/lease/use/range/save"
    },
    {
      "method": "getAllUrl",
      "className": "com.hkwl.hkboot.smp.controller.ListAllMethodController",
      "type": "GET",
      "url": "/list/all/methods"
    },
    {
      "method": "downloadExcelTemplate",
      "className": "com.hkwl.hkboot.smp.controller.NioFileTransmitController",
      "type": "GET",
      "url": "/nio/download"
    },
    {
      "parent": "/promethues/",
      "method": "online",
      "className": "com.hkwl.hkboot.smp.controller.PromethuesController",
      "url": "/promethues/online"
    },
    {
      "parent": "/promethues/",
      "method": "testIsUsable",
      "className": "com.hkwl.hkboot.smp.controller.PromethuesController",
      "type": "GET",
      "url": "/promethues/testIsUsable"
    },
    {
      "parent": "/promethues/",
      "method": "testIsCore",
      "className": "com.hkwl.hkboot.smp.controller.PromethuesController",
      "type": "GET",
      "url": "/promethues/testIsCore"
    },
    {
      "method": "getPictureInfo",
      "className": "com.hkwl.hkboot.smp.controller.ReadPictureInfoController",
      "type": "GET",
      "url": "/picture/info"
    },
    {
      "method": "test",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "POST",
      "url": "/test"
    },
    {
      "method": "wrong",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "GET",
      "url": "/threadLocal/wrong"
    },
    {
      "method": "correct",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "GET",
      "url": "/threadLocal/correct"
    },
    {
      "method": "concurrentHashMapWrong",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "GET",
      "url": "/concurrentHashMap/wrong"
    },
    {
      "method": "concurrentHashMapCorrect",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "GET",
      "url": "/concurrentHashMap/correct"
    },
    {
      "method": "testDefaultAccess",
      "className": "com.hkwl.hkboot.smp.controller.SmpPcConcController",
      "type": "POST",
      "url": "/test/default/access"
    },
    {
      "method": "updateFileName",
      "className": "com.hkwl.hkboot.smp.controller.UpdateFileNameController",
      "type": "POST",
      "url": "/file/name/update"
    },
    {
      "method": "updateFileNameRegex",
      "className": "com.hkwl.hkboot.smp.controller.UpdateFileNameController",
      "type": "POST",
      "url": "/file/name/regex/update"
    },
    {
      "parent": "/swagger-resources",
      "method": "securityConfiguration",
      "className": "springfox.documentation.swagger.web.ApiResourceController",
      "url": "/swagger-resources/configuration/security"
    },
    {
      "parent": "/swagger-resources",
      "method": "uiConfiguration",
      "className": "springfox.documentation.swagger.web.ApiResourceController",
      "url": "/swagger-resources/configuration/ui"
    },
    {
      "parent": "/swagger-resources",
      "method": "swaggerResources",
      "className": "springfox.documentation.swagger.web.ApiResourceController",
      "url": "/swagger-resources"
    },
    {
      "method": "apiSorts",
      "className": "com.github.xiaoymin.swaggerbootstrapui.web.SwaggerBootstrapUiController",
      "type": "GET",
      "url": "/v2/api-docs-ext"
    },
    {
      "parent": "/swagger-resources-ext",
      "method": "swaggerResources",
      "className": "com.github.xiaoymin.swaggerbootstrapui.web.SwaggerBootstrapUiResourceExtController",
      "url": "/swagger-resources-ext"
    },
    {
      "parent": "${server.error.path:${error.path:/error}}",
      "method": "error",
      "className": "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
      "url": "/error"
    },
    {
      "parent": "${server.error.path:${error.path:/error}}",
      "method": "errorHtml",
      "className": "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
      "url": "/error"
    }
  ]
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot项目中统计所有Controller中的方法 的相关文章

  • linux 终端 删除,如何真正清除终端?

    问题描述 我可以发出clear命令或按Ctrl L清除当前的Ubuntu终端 但这只是向上移动以前的输出 如果使用鼠标滚动或PgUP和PgDown键 很难区分前一个命令的输出结束和输出当前命令开始 有没有办法真正清除终端 所以我不会看到以前
  • GOOGLE开发者工具之CONSOLE

    代码调试 我们可以用console来调试js代码 有图有真相 我的代码执行到161行 如果想打印下 result 我就可以在Console中进行调试 输入代码 alert result result 回车即可 即可弹出result的结果 或

随机推荐

  • 需要使用新应用以打开此steam链接_Steam加好友的N种方法,完美解决教程

    Steam好友打不开 网络无法访问 不知道好友代码是什么在哪里 到底怎么样才能加上正确的好友 这里全部你一一解答 steam好友页面打不开 网络无法访问 很多人可能发现不论是手机端还是客户端都会发生steam社区打不开的情况 其实steam
  • power bi公式运用

    从原有的表中提取数据 生成新的表格 从销售数据汇总表中提取日期成本 生产新的销售成本表 其中 成本 相当于在新表中的名称 沿用旧表表头 销售成本表 SUMMARIZE 销售数据汇总 销售数据汇总 日期 成本 SUM 销售数据汇总 成本 自己
  • 字符串最长重复连续子串

    比如字符串aaaabbbcddc 因为aaaa最长 返回4 本题是面试遇到的真题 需要熟练手写 String数组中 top3的字符与出现的次数 如ababc 输出 a 2 b 2 c 1
  • TCP是如何传输数据的?

    做IT相关的工作 肯定都离不开网络 网络中最重要的协议是TCP 无论是实际工作还是笔试面试 你看哪里能少得了TCP 我考过RFC中与TCP相关的文档 也看过Linux中与TCP相关的源码 也看过不少框架中的TCP相关的代码 对TCP是有点感
  • jq 中如何调用vue的方法

    jq 中如何调用 vue的方法
  • vs2019下内存泄漏检测工具VLD(Visual Leak Detector)的使用

    前言 我们在c 程序开发中经常在使用指针时 会出现内存泄漏的情况 但是很多时候很难定位到是哪个指针出问题了 这时候就需要内存泄漏检查工具 其中比较好用的就是 VLD Visual Leak Detector 下载 VLD下载地址 安装完成后
  • 【华为OD机试c++/java/python】称砝码【 2023 Q1 A卷

    题目描述 现有n种砝码 重量互不相等 分别为 m1 m2 m3 mn 每种砝码对应的数量为 x1 x2 x3 xn 现在要用这些砝码去称物体的重量 放在同一侧 问能称出多少种不同的重量 注 称重重量包括 0 数据范围 每组输入数据满足 1
  • [机缘参悟-65]:《兵者,诡道也》-7-三十六计解读-败战计

    目录 前言 第1章 三十六计 概述 第六套 败战计 第三十一计 美人计 第三十二计 空城计 第三十三计 反间计 第三十四计 苦肉计 第三十五计 连环计 第三十六计 走为上计 前言 兵者 诡道也 兵者 道 的部分 是 道 的另一面 如果 天道
  • Box2D射线和AABB碰撞检测

    box2d使用了一种叫做slab的碰撞检测算法 所谓slab是指两个平行平面之间的空间 由此我们可以把3D空间中的AABB盒子看做是由AABB的3组平行面形成的3个方向的slab的交集 根据这个定义 我们可以得到以下两个结论 1 如果一个点
  • mysql启动报错:Starting MySQL... ERROR! The server quit without updating PID file

    mysql启动时报错 Starting MySQL ERROR The server quit without updating PID file opt mysql data mysql pid 的解决方法 1 可能是 opt mysql
  • [MySQL]一文带你学明白数据库控制语言——DCL

    前言 嗨咯 小伙伴大家好呀 好几天没见了 周末过得怎么样啊 之前学过的SQL语句不会都忘了吧 如果忘了的话大家可以看一下前几期的文章 本期要学习的是SQL语句中的数据库控制语句 DCL 学习完毕之后MySQL中的SQL语句也就结束了 数据库
  • [388]码云使用说明

    码云如何上传项目 码云上传项目 需要3个步骤 在码云网站建立一个空项目 把这个空项目拉到本地 把自己的项目放到这个空项目里面并提交 1 在码云的页面 点击右上角的加号 2 选择新建项目 3 在跳转的页面简要填写项目信息 除了名称和路径 其它
  • 使用HttpClient下载网页

    Httpclient是一个非常好用的第三方库 用于网络编程 可以用来做个爬虫程序什么之类的 安卓中内置的网络编程库就是httpclient 下面就可大家介绍介绍怎么使用httpclient下载新浪首页的源代码 其过程就是首先构建一个http
  • python怎么调用文件_Python如何调用m文件

    Python如何调用m文件 一 安装Python 并正确配置环境变量 matlab2016a只支持python2 7 python3 3 python3 4 python3 4以上版本不支持 推荐学习 Python教程 二 安装Matlab
  • CSS中如何实现一个自适应正方形(宽高相等)的元素?

    聚沙成塔 每天进步一点点 专栏简介 利用 padding 百分比 2 利用 before 伪元素 写在最后 专栏简介 前端入门之旅 探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅
  • cocos2dx中的内存加载PLIST

    今天 加载图片时有问题 myButtonPList loadTextures jineng 02103 png jineng 02103 light png jineng 03101 png UI TEX TYPE PLIST myButt
  • 时间趋势可视化-柱形图

    第1关 大胃王 比赛数据柱形图绘制 绘制柱形图的基本步骤 本关任务 根据实训提供的 大胃王 比赛数据绘制柱形图 熟悉柱形图绘制的基本步骤 coding utf 8 import pandas as pd from matplotlib im
  • 利用CIBERSORT免疫细胞类群分析详细教程

    利用CIBERSORT免疫细胞类群分析详细教程 现在最火的组学技术是什么 无疑便是单细胞测序了 通过单细胞测序 科研人员可以获得比原来更为精细的细胞图谱 但是单细胞测序诸多限制条件 也是不能让大家很好地利用这项技术解决自己的科学问题 除了较
  • 【Qt】通过QtCreator源码学习Qt(十二):Q_D和Q_Q指针(简称“d指针”)详解

    1 Q D和Q Q指针 简称 d指针 简介 参考博客 https www devbean net 2016 11 qt creator source study 07 https blog csdn net rabinsong articl
  • SpringBoot项目中统计所有Controller中的方法

    对接口方法进行抽象 Data public class ControllerMethodItem public String controllerName public String methodName public String req