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

参考

相关文章
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
131 3
|
20天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
7天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
54 13
|
1天前
|
数据采集 JSON Java
利用Java获取京东SKU接口指南
本文介绍如何使用Java通过京东API获取商品SKU信息。首先,需注册京东开放平台账号并创建应用以获取AppKey和AppSecret。接着,查阅API文档了解调用方法。明确商品ID后,构建请求参数并通过HTTP客户端发送请求。最后,解析返回的JSON数据提取SKU信息。注意遵守API调用频率限制及数据保护法规。此方法适用于电商平台及其他数据获取场景。
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
37 6
|
15天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
23天前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
23 2
|
28天前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
48 3
|
27天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
77 1
|
27天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
60 1
下一篇
DataWorks