获取 Spring Boot 中的所有端点

1、概览

本文将带你了解如何获取 Spring Boot 应用中的所有 REST 端点。

2、映射端点

在 Spring Boot 应用中,通过在 Controller 类中使用 @RequestMapping 注解来暴露 REST API 端点。要获取这些端点,有三种选择:事件监听器、Spring Boot Actuator 或 SpringDoc。

3、事件监听器

在 Controller 中使用 @RestController@RequestMapping 创建 REST API 服务。这些类在 Spring Application Context 中注册为 Spring Bean。因此,当 Application Context 在启动时准备就绪,就可以使用事件监听器获取端点。定义监听器有两种方法。可以实现 ApplicationListener 接口,或者使用 @EventListener 注解。

3.1、ApplicationListener 接口

在实现 ApplicationListener 时,必须定义 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 事件类。该事件在 ApplicationContext 初始化或刷新时发布。Spring Boot 提供了许多 HandlerMapping 实现。其中,RequestMappingHandlerMapping 类可检测请求映射,并被 @RequestMapping 注解所使用。因此,在 ContextRefreshedEvent 事件中使用了该 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、Actuator

检索所有端点列表的第二种方法是使用 Spring Boot Actuator 功能。

4.1、Maven 依赖

pom.xml 中添加 spring-boot-actuator Maven 依赖:

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

4.2、配置

当添加 spring-boot-actuator 依赖时,默认情况下只有 /health/info 端点可用。要启用所有 Actuator 端点,可以通过在 application.properties 文件中添加一个属性来公开它们:

management.endpoints.web.exposure.include=*

或者,可以简单地公开用于检索 mappings 的端点:

management.endpoints.web.exposure.include=mappings

启用后,访问 http://host/actuator/mappings 就可以获取应用中的所有 REST API 端点。

5、SpringDoc

还可以用 SpringDoc 库列出所有的 REST API 端点。

5.1、Maven 依赖

pom.xml 中添加 springdoc-openapi-ui 依赖:

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

5.2、配置

创建配置类,定义 OpenAPI Bean:

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

访问如下 SpringDoc 文档端点,即可获取应用中的所有 REST API 端点:

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

6、总结

本文介绍了如何使用事件监听器、Spring Boot Actuator 和 SpringDoc 在 Spring Boot 应用中获取所有的 REST API 端点。


Ref:https://www.baeldung.com/spring-boot-get-all-endpoints