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

参考

相关文章
|
18天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
40 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
2天前
|
XML Java Maven
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
在 Cucumber 测试中自动将 Cucumber 数据表映射到 Java 对象
19 7
|
1天前
|
安全 Java 数据安全/隐私保护
【一步一步了解Java系列】:探索抽象类与接口的秘密
【一步一步了解Java系列】:探索抽象类与接口的秘密
11 3
|
6天前
|
Java
Java中抽象类和接口有什么区别?
本文阐述了Java中抽象类和接口的区别,包括类型扩展、方法/属性访问控制符、方法实现、使用目的等方面的不同,并提供了抽象类和接口的使用示例,以及Java中其他类型的类(普通类、内部类等)的简介。
11 0
Java中抽象类和接口有什么区别?
|
16天前
|
Java 测试技术
Java接口的生产环境应用注意点
在Java生产环境中,合理使用接口对提升代码质量至关重要。设计接口时应遵循单一职责原则,采用清晰命名,并控制方法数量。默认方法应谨慎使用,避免与实现类产生冲突。通过版本化管理接口更新,确保向后兼容。实现接口时需明确行为,保持实现与接口分离,利用多态增强灵活性。关注性能影响,适当文档注释及充分测试确保接口稳定可靠。综合运用这些策略,可以显著提高系统的可扩展性和维护性。
|
16天前
|
Java
Java 接口的简化理解
Java 接口是一种强大的概念,用于定义方法签名而非具体实现,作为行为规范,强调功能而非实现细节。接口是特殊的引用类型,包含常量和方法签名。其特点包括:无实现方法体、支持多重继承、内置常量定义。通过示例展示了如何定义和实现接口,以及如何通过接口引用调用实现类的方法。接口的应用场景包括抽象化、插件架构和松耦合设计。从 Java 8 起,接口还支持默认方法和静态方法,进一步增强了其灵活性和扩展性。理解接口是 Java 编程的基础之一。
|
17天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
18天前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
|
18天前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
18天前
|
存储 前端开发 Java
springboot文件上传和下载接口的简单思路
本文介绍了在Spring Boot中实现文件上传和下载接口的简单思路。文件上传通过`MultipartFile`对象获取前端传递的文件并存储,返回对外访问路径;文件下载通过文件的uuid名称读取文件,并通过流的方式输出,实现文件下载功能。
springboot文件上传和下载接口的简单思路