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);
        }
    }

效果图:

相关推荐
BillKu19 分钟前
Spring Boot 多环境配置
java·spring boot·后端
new_daimond29 分钟前
Spring Boot项目集成日志系统使用完整指南
spring boot·后端
哈基米喜欢哈哈哈1 小时前
Kafka复制机制
笔记·分布式·后端·kafka
君不见,青丝成雪2 小时前
SpringBoot项目占用内存优化
java·spring boot·后端
一叶飘零_sweeeet2 小时前
如何避免MyBatis二级缓存中的脏读
java·redis·mybatis
Trust yourself2432 小时前
IDEA控制台乱码(Tomcat)解决方法
java·tomcat·intellij-idea
追逐时光者3 小时前
一个 .NET 开源、功能强大的在线文档编辑器,类似于 Microsoft Word,支持信创!
后端·.net
##学无止境##3 小时前
解锁Java分布式魔法:CAP与BASE的奇幻冒险
java·开发语言·分布式
3Cloudream3 小时前
互联网大厂Java面试深度解析:从基础到微服务云原生的全场景模拟
java·spring boot·redis·elasticsearch·微服务·kafka·电商架构