Java:SpringBoot获取所有接口的路由映射关系

简介: Java:SpringBoot获取所有接口的路由映射关系

重要:版本很重要,先说一下版本,版本不一样,可能获取结果也不一样

spring-boot 2.7.7
java 1.8

定义一个查看路由的数据结构

package com.example.demo.entity;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Set;
@Data
public class Route {
    /**
     * 类名
     */
    private String className;
    /**
     * 方法名
     */
    private String methodName;
    /**
     * 匹配规则
     */
    private Set<String> patterns;
    /**
     * 请求方式 GET/POST
     */
    private Set<RequestMethod> methods;
}

获取SpringBoot路由映射关系

package com.example.demo.config;
import com.example.demo.entity.Route;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PathPatternsRequestCondition;
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 org.springframework.web.util.pattern.PathPattern;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * 获取SpringBoot路由映射关系
 */
@Component
public class RouteConfig {
    @Autowired
    private WebApplicationContext applicationContext;
    /**
     * 获取所有路由映射关系
     *
     * @return
     */
    public List<Route> getAllRouteMapping() {
        RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
        // 获取url与类和方法的对应信息
        Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods();
        List<Route> list = new ArrayList<>();
        // 遍历
        for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
            Route route = this.getRoute(entry);
            list.add(route);
        }
        return list;
    }
    /**
     * 获取路由对象
     *
     * @return
     */
    public Route getRoute(Map.Entry<RequestMappingInfo, HandlerMethod> entry) {
        Route route = new Route();
        RequestMappingInfo info = entry.getKey();
        // 请求路径
        PathPatternsRequestCondition requestCondition = info.getPathPatternsCondition();
        if (requestCondition != null) {
            Set<PathPattern> patterns = requestCondition.getPatterns();
            if (patterns != null) {
                route.setPatterns(patterns
                        .stream()
                        .map(PathPattern::getPatternString)
                        .collect(Collectors.toSet()));
            }
        }
        // 请求方法
        RequestMethodsRequestCondition methodsCondition = info.getMethodsCondition();
        if (methodsCondition != null) {
            route.setMethods(methodsCondition.getMethods());
        }
        HandlerMethod method = entry.getValue();
        // 类名
        route.setClassName(method.getMethod().getDeclaringClass().getName());
        // 方法名
        route.setMethodName(method.getMethod().getName());
        return route;
    }
}

通过控制器输出路由映射数据

package com.example.demo.controller;
import com.example.demo.config.RouteConfig;
import com.example.demo.entity.Route;
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.RestController;
import java.util.List;
@RestController
@RequestMapping("/api")
public class AppIndexController {
    @Autowired
    private RouteConfig routeConfig;
    @GetMapping("/route")
    public List<Route> route() {
        return routeConfig.getAllRouteMapping();
    }
}

访问路径:http://localhost:8080/api/route

输出数据如下

[
    {
        "className": "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
        "methodName": "errorHtml",
        "patterns": [
            "/error"
        ],
        "methods": []
    },
    {
        "className": "org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController",
        "methodName": "error",
        "patterns": [
            "/error"
        ],
        "methods": []
    },
    {
        "className": "com.example.demo.controller.AppIndexController",
        "methodName": "route",
        "patterns": [
            "/api/route"
        ],
        "methods": [
            "GET"
        ]
    }
]

完整代码: https://github.com/mouday/spring-boot-demo

参考

相关文章
|
6天前
|
监控 Java Spring
SpringBoot:SpringBoot通过注解监测Controller接口
本文详细介绍了如何通过Spring Boot注解监测Controller接口,包括自定义注解、AOP切面的创建和使用以及具体的示例代码。通过这种方式,可以方便地在Controller方法执行前后添加日志记录、性能监控和异常处理逻辑,而无需修改方法本身的代码。这种方法不仅提高了代码的可维护性,还增强了系统的监控能力。希望本文能帮助您更好地理解和应用Spring Boot中的注解监测技术。
34 16
|
7天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
35 5
|
26天前
|
JavaScript Java 测试技术
基于Java+SpringBoot+Vue实现的车辆充电桩系统设计与实现(系统源码+文档+部署讲解等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
57 6
|
30天前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
41 5
|
30天前
|
监控 Java API
【潜意识Java】使用SpringBoot构建高效的RESTfulAPI
本文介绍了使用Spring Boot构建RESTful API的完整流程,涵盖从项目创建到API测试的各个步骤。
49 1
|
30天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
56 2
|
1月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
93 33
|
1月前
|
Java 开发者 Spring
java springboot监听事件和处理事件
通过上述步骤,开发者可以在Spring Boot项目中轻松实现事件的发布和监听。事件机制不仅解耦了业务逻辑,还提高了系统的可维护性和扩展性。掌握这一技术,可以显著提升开发效率和代码质量。
78 13
|
6月前
|
SQL Java 测试技术
SpringBoot单元测试快速写法问题之PorkService 接口中的 getPork 方法的作用如何解决
SpringBoot单元测试快速写法问题之PorkService 接口中的 getPork 方法的作用如何解决
|
8月前
|
监控 druid Java
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
Springboot用JUnit测试接口时报错Failed to determine a suitable driver class configure a DataSource: ‘url‘
159 0