1、概览 {#1概览}
本文将带你了解如何获取 Spring Boot 应用中的所有 REST 端点。
2、映射端点 {#2映射端点}
在 Spring Boot 应用中,通过在 Controller 类中使用 @RequestMapping
注解来暴露 REST API 端点。要获取这些端点,有三种选择:事件监听器、Spring Boot Actuator 或 SpringDoc。
3、事件监听器 {#3事件监听器}
在 Controller 中使用 @RestController
和 @RequestMapping
创建 REST API 服务。这些类在 Spring Application Context 中注册为 Spring Bean。因此,当 Application Context 在启动时准备就绪,就可以使用事件监听器获取端点。定义监听器有两种方法。可以实现 ApplicationListener
接口,或者使用 @EventListener
注解。
3.1、ApplicationListener
接口 {#31applicationlistener-接口}
在实现 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
注解 {#32eventlistener-注解}
另一种方法是使用 @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 {#4actuator}
检索所有端点列表的第二种方法是使用 Spring Boot Actuator 功能。
4.1、Maven 依赖 {#41maven-依赖}
在 pom.xml
中添加 spring-boot-actuator
Maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.2、配置 {#42配置}
当添加 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 {#5springdoc}
还可以用 SpringDoc 库列出所有的 REST API 端点。
5.1、Maven 依赖 {#51maven-依赖}
在 pom.xml
中添加 springdoc-openapi-ui
依赖:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.7.0</version>
</dependency>
5.2、配置 {#52配置}
创建配置类,定义 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、总结 {#6总结}
本文介绍了如何使用事件监听器、Spring Boot Actuator 和 SpringDoc 在 Spring Boot 应用中获取所有的 REST API 端点。
Ref:https://www.baeldung.com/spring-boot-get-all-endpoints