SpringBoot如何获取系统Controller名称和方法名称

这种代码里面的Controller和里面的方法怎么获取

代码:

/*** 获取所有Controller名称*/@ApiDescription("获取所有Controller名称")@PostMapping("/getControllerNames")public Result getControllerNames() {return dataDesensitizationRulesService.getAllControllerNames();}/*** 根据Controller获取方法列表*/@ApiDescription("根据Controller获取方法列表")@PostMapping("/getControllerMethods")public Result getControllerMethods(@RequestBody @Valid DataDesensitizationRulesMethodsForm dataDesensitizationRulesMethodsForm) {return dataDesensitizationRulesService.getControllerMethods(dataDesensitizationRulesMethodsForm);}

 /*** 获取所有Controller名称*/public Result getAllControllerNames() {List<String> controllerNames = new ArrayList<>();// 获取所有带有 @RestController 注解的BeanMap<String, Object> restControllers = applicationContext.getBeansWithAnnotation(RestController.class);restControllers.values().forEach(bean -> {Class<?> clazz = AopUtils.getTargetClass(bean);  // 获取原始类controllerNames.add(clazz.getSimpleName());       // 获取简单类名});// 获取所有带有 @Controller 注解的BeanMap<String, Object> controllers = applicationContext.getBeansWithAnnotation(Controller.class);controllers.values().forEach(bean -> {Class<?> clazz = AopUtils.getTargetClass(bean);  // 获取原始类controllerNames.add(clazz.getSimpleName());       // 获取简单类名});return Result.ok().build("allControllerNames", controllerNames);}/*** 根据Controller名称获取方法列表*/public Result getControllerMethods(DataDesensitizationRulesMethodsForm dataDesensitizationRulesMethodsForm) {String controllerName = dataDesensitizationRulesMethodsForm.getControllerName();try {List<Map<String, Object>> controllerDetails = getControllerDetails();Optional<Map<String, Object>> controllerOpt = controllerDetails.stream().filter(info -> controllerName.equals(info.get("className"))).findFirst();if (controllerOpt.isPresent()) {@SuppressWarnings("unchecked")List<Map<String, String>> methods = (List<Map<String, String>>) controllerOpt.get().get("methods");return Result.ok().build("allControllerMethods",methods);} else {return Result.error("Controller不存在");}} catch (Exception e) {return Result.error("获取失败: " + e.getMessage());}}/*** 获取Controller详细信息*/public List<Map<String, Object>> getControllerDetails() {List<Map<String, Object>> controllerDetails = new ArrayList<>();// 处理@RestControllerMap<String, Object> restControllers = applicationContext.getBeansWithAnnotation(RestController.class);processControllers(restControllers, controllerDetails);// 处理@ControllerMap<String, Object> controllers = applicationContext.getBeansWithAnnotation(Controller.class);processControllers(controllers, controllerDetails);return controllerDetails;}private void processControllers(Map<String, Object> controllers, List<Map<String, Object>> details) {for (Map.Entry<String, Object> entry : controllers.entrySet()) {Object controller = entry.getValue();Class<?> clazz = AopUtils.getTargetClass(controller); // 关键修改:获取原始类Map<String, Object> info = new HashMap<>();info.put("beanName", entry.getKey());info.put("className", clazz.getSimpleName());info.put("fullClassName", clazz.getName());// 获取RequestMapping注解信息(从原始类上获取)RequestMapping classMapping = AnnotationUtils.findAnnotation(clazz, RequestMapping.class);if (classMapping != null) {info.put("basePath", Arrays.toString(classMapping.value()));}// 获取方法信息(从原始类上获取)List<Map<String, String>> methods = new ArrayList<>();for (Method method : clazz.getDeclaredMethods()) {// 使用AnnotationUtils查找注解,确保能从接口/父类方法上找到注解GetMapping getMapping = AnnotationUtils.findAnnotation(method, GetMapping.class);PostMapping postMapping = AnnotationUtils.findAnnotation(method, PostMapping.class);RequestMapping requestMapping = AnnotationUtils.findAnnotation(method, RequestMapping.class);if (getMapping != null || postMapping != null || requestMapping != null) {Map<String, String> methodInfo = new HashMap<>();methodInfo.put("methodName", method.getName());if (getMapping != null) {methodInfo.put("httpMethod", "GET");methodInfo.put("path", Arrays.toString(getMapping.value()));} else if (postMapping != null) {methodInfo.put("httpMethod", "POST");methodInfo.put("path", Arrays.toString(postMapping.value()));} else if (requestMapping != null) {methodInfo.put("httpMethod", Arrays.toString(requestMapping.method()));methodInfo.put("path", Arrays.toString(requestMapping.value()));}methods.add(methodInfo);}}info.put("methods", methods);details.add(info);}}

效果图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96876.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二十二)深入了解AVFoundation-编辑:视频变速功能-实战在Demo中实现视频变速

一. 引言视频变速&#xff08;Speed Ramp&#xff09;是视频编辑中最常见的特效之一&#xff1a;慢动作&#xff08;Slow Motion&#xff09;&#xff1a;强调细节&#xff0c;让观众捕捉到肉眼难以察觉的瞬间&#xff1b;快动作&#xff08;Fast Motion&#xff09;&#xff1…

MCP零基础学习(7)|实战指南:构建论文分析智能体

在之前的教程中&#xff0c;我们已经介绍了 MCP&#xff08;Model Context Protocol&#xff09;的基本概念及其核心组件。在本篇教程中&#xff0c;我们将通过一个实际案例&#xff0c;演示如何运用 MCP 构建一个能够分析学术论文的智能体。这个智能体将具备读取 PDF 文件、提…

Unity URP半透明物体自身交叠解决方案

前言 在 Unity 的通用渲染管线&#xff08;URP&#xff09;中&#xff0c;处理半透明物体的自身交叠是一个常见挑战。当半透明物体&#xff08;如玻璃、水或透明材质&#xff09;的某些部分相互重叠时&#xff0c;可能会出现渲染顺序问题&#xff0c;导致视觉瑕疵。 对惹&…

哈希算法入门:深入浅出讲明白HASH哈希算法

一、先搞懂&#xff1a;哈希算法到底是 “啥玩意儿”&#xff1f;咱们先别碰复杂概念&#xff0c;从你每天都会遇到的事说起 —— 你会发现&#xff0c;“哈希思维” 其实早就藏在生活里了。&#xff08;一&#xff09;生活中的 “哈希例子”&#xff1a;给东西 “贴标签、找位…

Vuex 和 Pinia 各自的优点

核心总结&#xff08;一句话概括&#xff09; Vuex&#xff1a;Vue 官方曾经的状态管理标准解决方案&#xff0c;成熟稳定&#xff0c;概念清晰&#xff0c;但语法稍显冗长。Pinia&#xff1a;Vue 官方推荐的新一代状态管理库&#xff0c;API 设计极其简洁&#xff0c;完美支持…

几种方式实现文件自动上传到服务器共享文件夹

文章目录一、方案核心逻辑二、详细实现步骤&#xff08;以Windows系统为例&#xff09;1. 确认服务器共享文件夹的“访问权限”&#xff08;前提&#xff09;2. 选择“传输触发方式”&#xff08;按需求选实时/周期&#xff09;&#xff08;1&#xff09;周期传输&#xff08;如…

Milvus介绍及多模态检索实践

1、核心组件 1.1 Collection (集合) 可以用一个图书馆的比喻来理解 Collection&#xff1a; Collection (集合): 相当于一个图书馆&#xff0c;是所有数据的顶层容器。一个 Collection 可以包含多个 Partition&#xff0c;每个 Partition 可以包含多个 Entity。 Partition (分区…

第二十三天-LCD液晶显示实验

一、LCD结构体定义LCD为LCD_TypeDef类型的指针&#xff0c;指向0x6C000000的地址空间&#xff08;bank1分区4的地址范围&#xff09;。为什么需要并上0x000007FE呢&#xff1f;因为虽然驱动SRAM的时序和16位8080接口时序&#xff08;驱动LCD时序&#xff09;很像&#xff0c;但…

SQL性能调优

MySQL出现性能差的原因有哪些? 可能是 SOL查询使用了全表扫描&#xff0c;也可能是查询语句过于复杂&#xff0c;如多表 IOIN 或嵌套子查询。 也有可能是单表数据量过大。 通常情况下&#xff0c;添加索引就能解决大部分性能问题。对于一些热点数据&#xff0c;还可以通过增加…

dapo:开源大规模llm强化学习系统的突破与实现

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; ✨ 1. dapo概述&#xff1a;开源llm强化学习系统的重要突破 dapo&…

【车载开发系列】ParaSoft集成测试环境配置(五)

【车载开发系列】ParaSoft集成测试环境配置(五) 【车载开发系列】ParaSoft集成测试环境配置(五) 【车载开发系列】ParaSoft集成测试环境配置(五) 一. 剥离硬件环境的设置 二. 灵活使用编译开关 三. 导入修改后的bdf文件 四. 自动生成底层桩函数 五. 开始跑集成测试用例 六…

大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?

目录一、什么是 MCP&#xff1f;1.1 &#x1f914; 开始之前的思考1.2 MCP 的定义1.3 MCP 结构二、MCP 的使用2.1 uv 的安装2.2 MCP 广场2.3 MCP 的配置2.4 MCP 的依赖安装2.5 Charry Studio2.6 测试结果背景&#xff1a; MCP 这个概念大概是 2025 年上半年火起来的&#xff0c…

源码导航页

一、Python捕捉动作发送到Unity驱动模型跟着动&#xff08;获取源码&#xff09; 二、AI输入法源码&#xff08;获取源码&#xff09; 三、Java企业级后台管理系统-登录授权角色菜单&#xff08;获取源码&#xff09; 四、Jetson实现纯视觉导航&#xff08;获取源码&#xff09…

HTTP/2 性能提升的核心原因

一、协议架构优化‌‌二进制分帧&#xff08;Binary Framing&#xff09;‌HTTP/2 将传统文本格式的报文&#xff08;如请求头、数据体&#xff09;拆分为独立的二进制帧&#xff08;Frame&#xff09;&#xff0c;每个帧包含流标识符&#xff08;Stream ID&#xff09;&#x…

vulnhub-billu_b0x靶机渗透

一、靶场详情 Billu_b0x 是 Vulnhub 上的经典中等难度靶机&#xff0c;主要考察从信息收集到提权的完整渗透流程&#xff1a;先通过端口和目录扫描发现网站入口&#xff0c;利用 SQL 注入或文件包含进入后台并上传 WebShell&#xff0c;再通过反弹 Shell 获取低权限用户&#…

C# 相机内存复用(减少图像采集耗时)以及行数复用

背景我们在做图像处理时&#xff0c;都会对一些相机的SDK进行开发完成图像采集的操作&#xff0c;为后续图像处理做准备。本文主要的目的是降低图像采集的耗时&#xff0c;应用在一些高速检测的场景下。利用循环队列内存复用的方式&#xff0c;去掉或者减少新建内存的时间。线扫…

MTK Linux DRM分析(十三)- Mediatek KMS实现mtk_drm_drv.c(Part.1)

一、简介 MediaTek (MTK) 的DRM驱动(基于mtk_drm_drv.c)是为MediaTek SoC(如MT6985、MT6895等)设计的显示子系统(Display Subsystem)驱动程序。它实现了Linux DRM/KMS框架,支持多CRTC、多平面(plane)、连接器(connector)和编码器(encoder)的显示管道。驱动处理硬…

Wireshark笔记-DHCP流程与数据包解析

背景DHCP从大学上网络课时就开始知道了&#xff0c;当时只知道&#xff0c;能让计算机上网&#xff0c;要不就静态配IP&#xff0c;要不就DHCP获取&#xff0c;就能上网。2021年时&#xff0c;毕业好几年了&#xff0c;想学习下网络知识&#xff0c;就准备考一个软考网工。按要…

Coze用户账号设置修改用户头像-前端源码

概述 Coze Studio的用户头像修改功能是用户账号设置中的重要组成部分&#xff0c;允许用户上传和更新个人头像。本文将深入分析该功能的前端实现&#xff0c;包括组件架构、文件上传处理、API设计和用户体验优化等方面。 技术架构 整体架构设计 Coze Studio采用现代化的前端架构…

新手Github提交PR(Pull requests)详细教程

一、什么是Pull requests&#xff1f; Pull Requests&#xff08;PR&#xff09;是代码协作平台&#xff08;如 GitHub、GitLab 等&#xff09;中的一种功能&#xff0c;用于提议将某分支的代码变更合并到另一个分支&#xff08;通常是主分支&#xff09;。它允许开发者在合并…