我有一个用 Spring Boot 编写的休息服务。我想在启动后获取所有端点。我怎样才能做到这一点? 为此,我想在启动后将所有端点保存到数据库(如果它们尚不存在)并使用它们进行授权。这些条目将被注入到角色中,角色将用于创建代币。
您可以在应用程序上下文启动时获取RequestMappingHandlerMapping。
@Component
public class EndpointsListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
applicationContext.getBean(RequestMappingHandlerMapping.class).getHandlerMethods()
.forEach(/*Write your code here */);
}
}
或者,您也可以使用 Spring boot 执行器(即使您不使用 Spring boot,也可以使用执行器),它公开另一个端点(映射端点),其中列出了 json 中的所有端点。您可以点击此端点并解析 json 以获取端点列表。
您需要 3 个步骤来公开所有端点:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在 Spring Boot 2 中,Actuator 禁用了大多数端点,默认情况下唯一可用的两个端点是:
/health
/info
如果要启用所有端点,只需设置:
management.endpoints.web.exposure.include=*
更多详情请参考:
https://docs.spring.io/spring-boot/docs/current/reference/html/product-ready-endpoints.html
顺便说一句,在 Spring Boot 2 中,Actuator 通过将其与应用程序模型合并来简化其安全模型。
更多详情请参考这篇文章:
自 Spring 4.2 起,您可以使用
@EventListener
注释,如下所示:
@Component
public class EndpointsListener {
private static final Logger LOGGER = LoggerFactory.getLogger(EndpointsListener.class);
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
applicationContext.getBean(RequestMappingHandlerMapping.class)
.getHandlerMethods().forEach((key, value) -> LOGGER.info("{} {}", key, value));
}
}
如果您想了解更多有关如何使用 Spring Events 和创建自定义事件的信息,请查看这篇文章:Spring Events
在application.properties中,我们需要 management.endpoints.web.exposure.include=映射
然后我们可以看到所有端点: http://localhost:8080/actuator/mappings
不要忘记将执行器添加到 POM。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
聚会迟到但你可以直接使用
@Autowired
private RequestMappingHandlerMapping requestHandlerMapping;
this.requestHandlerMapping.getHandlerMethods()
.forEach((key, value) -> /* whatever */));