1. 概述

在开发 REST API 时,我们经常需要获取应用中所有暴露的接口信息。例如,将这些接口信息存入数据库用于权限控制或文档生成。本文将介绍几种在 Spring Boot 应用中获取所有 REST 接口的方式。

2. 获取接口的几种方式

在 Spring Boot 中,我们通过 @RequestMapping 注解来暴露 REST 接口。要获取这些接口信息,主要有以下三种方式:

  • ✅ 事件监听器(Event Listener)
  • ✅ Spring Boot Actuator
  • ✅ SpringDoc(OpenAPI)

接下来我们逐个来看。

3. 使用事件监听器方式

在 Spring 中,所有被 @RestController@RequestMapping 注解标记的类都会注册为 Spring Bean。我们可以在应用上下文初始化完成后,通过监听事件来获取这些接口信息。

3.1. 实现 ApplicationListener 接口

实现 ApplicationListener<ContextRefreshedEvent> 接口,并重写 onApplicationEvent 方法:

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
    ApplicationContext applicationContext = event.getApplicationContext();
    RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
        .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
    Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
        .getHandlerMethods();
    map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}

这里使用了 ContextRefreshedEvent 事件,它在 Spring 上下文初始化或刷新时触发。我们从中获取 RequestMappingHandlerMapping Bean,然后拿到所有接口映射。

3.2. 使用 @EventListener 注解

更简洁的方式是直接在方法上使用 @EventListener 注解监听 ContextRefreshedEvent

@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
    ApplicationContext applicationContext = event.getApplicationContext();
    RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
        .getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
    Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
        .getHandlerMethods();
    map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}

两种方式本质一样,推荐使用注解方式,更简洁直观。

4. 使用 Spring Boot Actuator 方式

Actuator 是 Spring Boot 提供的监控和管理功能模块,也可以用来获取接口信息。

4.1. 添加依赖

首先在 pom.xml 中添加 Actuator 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

4.2. 配置暴露接口

默认只暴露 /health/info,我们需要在 application.properties 中配置暴露 /mappings 接口:

management.endpoints.web.exposure.include=mappings

或者直接暴露所有接口(生产环境慎用):

management.endpoints.web.exposure.include=*

配置完成后,访问以下地址即可获取所有接口信息:

http://localhost:8080/actuator/mappings

⚠️ 注意:这种方式更适合用于监控和调试,不适合直接用于业务逻辑中。

5. 使用 SpringDoc(OpenAPI)

如果你项目中使用了 SpringDoc 来生成 API 文档,那么也可以通过它来获取接口信息。

5.1. 添加依赖

pom.xml 中添加:

<dependency>
     <groupId>org.springdoc</groupId>
     <artifactId>springdoc-openapi-ui</artifactId>
     <version>1.7.0</version>
</dependency>

5.2. 配置 OpenAPI Bean

创建配置类,定义 OpenAPI Bean:

@Bean
public OpenAPI openAPI() {
    return new OpenAPI().info(new Info().title("SpringDoc example")
        .description("SpringDoc application")
        .version("v0.0.1"));
}

然后访问以下地址即可查看所有接口文档:

http://localhost:8080/swagger-ui/index.html

✅ 这种方式适合用于文档展示和前端对接,同时也能间接获取接口信息。

6. 总结

本文介绍了三种在 Spring Boot 中获取 REST 接口的方法:

方式 适用场景 说明
事件监听器 应用启动时自动获取接口信息 灵活、可控
Actuator 监控、调试 适合运维
SpringDoc/OpenAPI 文档展示、接口管理 适合前端对接

📌 建议:如果只是用于内部记录或初始化数据,推荐使用事件监听器;如果是用于监控或调试,使用 Actuator;如果是用于对外文档展示,使用 SpringDoc。

所有示例代码均可在 GitHub 获取:GitHub 示例代码


原始标题:Get All Endpoints in Spring Boot | Baeldung

« 上一篇: 在Java中解码JWT令牌
» 下一篇: Java Weekly, 第377期