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

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

代码:

java 复制代码
    /**
     * 获取所有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);
    }
java 复制代码
 /**
     * 获取所有Controller名称
     */
    public Result getAllControllerNames() {
        List<String> controllerNames = new ArrayList<>();
        // 获取所有带有 @RestController 注解的Bean
        Map<String, Object> restControllers = applicationContext.getBeansWithAnnotation(RestController.class);
        restControllers.values().forEach(bean -> {
            Class<?> clazz = AopUtils.getTargetClass(bean);  // 获取原始类
            controllerNames.add(clazz.getSimpleName());       // 获取简单类名
        });
        // 获取所有带有 @Controller 注解的Bean
        Map<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<>();
        // 处理@RestController
        Map<String, Object> restControllers = applicationContext.getBeansWithAnnotation(RestController.class);
        processControllers(restControllers, controllerDetails);
        // 处理@Controller
        Map<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);
        }
    }

效果图:

相关推荐
马猴烧酒.20 小时前
【JAVA数据传输】Java 数据传输与转换详解笔记
java·数据库·笔记·tomcat·mybatis
爱编码的傅同学20 小时前
【常见锁的概念】死锁的产生与避免
java·开发语言
rabbit_pro21 小时前
SpringBoot3使用PostGis+GeoTools整合MybatisPlus
java·spring
望眼欲穿的程序猿21 小时前
Ai8051U+DHT11温湿度!
java·开发语言
一只大马猴呀21 小时前
IntelliJ IDEA 中启动项目不显示端口号
java·ide·intellij-idea
Hx_Ma161 天前
Map集合的5种遍历方式
java·前端·javascript
小手cool1 天前
Java 列表中查找最小值和最大值最有效率的方法
java
惊讶的猫1 天前
多线程同步问题及解决
java·开发语言·jvm
wfsm1 天前
工厂模式创建动态代理实现类
java·开发语言
好好研究1 天前
总结SSM设置欢迎页的方式
xml·java·后端·mvc