Spring Boot 执行器/Swagger

Posted

技术标签:

【中文标题】Spring Boot 执行器/Swagger【英文标题】:Spring Boot Actuator / Swagger 【发布时间】:2016-02-13 21:15:51 【问题描述】:

我正在开发 Spring Boot 应用程序,我使用 Swagger 作为文档。

我在我的应用程序上添加了 Spring Boot Actuator,但现在我想在我的招摇文档中添加由执行器 (/health /metrics ..) 创建的新服务。

我没有找到如何配置 Actuator 和 Swagger。

【问题讨论】:

【参考方案1】:

替代方案:

a) 在正则表达式中排除带有NOT的路径?

@Bean
public Docket api() 
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.regex("^((?!/error).)*")) // exclude Basic Error Controller
            .build();

b) 或链并否定谓词

PathSelectors.any()
  .and(PathSelectors.regex("/error").negate())
  .and(PathSelectors.regex("/manage.*").negate());

【讨论】:

【参考方案2】:

您可以在 Swagger 中配置要添加到文档中的路径:

@Bean
public Docket appApi() 
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(PathSelectors.any())
            ...

将显示所有可用的端点。

.paths(PathSelectors.any("/mypath/**")) 将仅限于在 mypath. 中公开的端点

【讨论】:

【参考方案3】:

通过application.properties 文件将执行器端点移动到上下文路径中。

management.context-path=/manage

然后你可以从 swagger 中排除该路径

@Bean
public Docket api() 
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(Predicates.not(PathSelectors.regex("/manage.*")))
            .build();

您可能也想排除错误控制器

@Bean
public Docket api() 
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.any())
            .paths(Predicates.not(PathSelectors.regex("(/manage.*|/error)")))
            .build();

【讨论】:

在我看来,这与 OP 的要求相反。 OP 想知道如何配置执行器端点以出现在 swagger 中,而不是从 swagger 中删除它们。看起来 /health 和 /info 不包含 swagger 元数据。 @axiopisty 我认为你是对的,我的错。我误解了,因为根据我的经验,默认情况下它们会大摇大摆地出现,我需要尝试删除它们。以上是最好的方法。【参考方案4】:
ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2)
  .useDefaultResponseMessages(false)
  .apiInfo(apiInfo())
  .securitySchemes(securitySchemes())
  .select()
  .apis(RequestHandlerSelectors.any())
  .paths(Predicates.not(PathSelectors.regex("/actuator.*")))
  .build();

您好,您可以排除正则表达式上的路径,然后将它们链接起来。

【讨论】:

【参考方案5】:

更新:2017 年 4 月 26 日,更新了实施。感谢Andy Brown 提供小费。

由于我们的编码约定,我们的端点没有特定的前缀,因此我一直在寻找一种解决方案来排除执行器端点,而不是包含我自己的路径。

我想出了以下配置,仅排除执行器端点。 这样一来,我就不必在添加新端点后更新配置,也不必为自己的端点添加前缀以将它们与执行器端点区分开来。

/**
 * This enables swagger. See http://localhost:8080/v2/api-docs for the swagger.json output!
 * @param actuatorEndpointHandlerMapping this endpoint handler mapping contains all the endpoints provided by the
 * spring actuator. We will iterate over all the endpoints and exclude them from the swagger documentation.
 * @return the docket.
 */
@Autowired
@Bean
public Docket swaggerSpringMvcPlugin(final EndpointHandlerMapping actuatorEndpointHandlerMapping) 
    ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2)
            .useDefaultResponseMessages(false)
            .apiInfo(apiInfo())
            .securitySchemes(securitySchemes())
            .select();

    // Ignore the spring-boot-actuator endpoints:
    Set<MvcEndpoint> endpoints = actuatorEndpointHandlerMapping.getEndpoints();
    endpoints.forEach(endpoint -> 
        String path = endpoint.getPath();
        log.debug("excluded path for swagger ", path);
        builder.paths(Predicates.not(PathSelectors.regex(path + ".*")));
    );

    return builder.build();

【讨论】:

这不是捕获执行器端点的非常可靠的方法。一方面,您的正则表达式捕获前缀而不是路径段。最好注入一个EndpointHandlerMapping bean 并使用getEndpoints() 来查找当前版本中可用的执行器端点。 你是绝对正确的@AndyBrown,谢谢你的提示!我不知道我可以通过这种方式检索端点。我已经相应地更新了我的解决方案。现在用完整的方法来展示如何自动装配它。

以上是关于Spring Boot 执行器/Swagger的主要内容,如果未能解决你的问题,请参考以下文章

spring boot整合swagger有啥好处

无法从 spring-boot 应用程序中调出 swagger-ui

Swagger Learing - Spring Boot 整合swagger

Spring Boot 集成Swagger

Spring boot整合Swagger

spring boot整合swagger