Spring 启动 - 仅在 Swagger UI 中公开端点,而不是通过直接 HTTP 调用

Spring Boot - expose endpoints only in Swagger UI but not via direct HTTP call

是否可以仅在 Swagger UI 中公开某些选定的端点,但通过直接 HTTP 调用使它们 un 在服务器上可用?

@Operation(hidden=true) 不在 Swagger 中公开端点 UI 但它仍然在服务器上可用。我只需要“倒置行为”。

用例:我们有 Swagger UI 通常在生产中被禁止。我希望某些端点仅在 Swagger UI 中可用,以便在开发期间进行测试。

版本:Spring Boot 2.6.2,springdoc-openapi-ui 1.6.3.

Use case:

  • we have Swagger UI normally forbidden in production.
  • I want to have some endpoints available only in Swagger UI for testing purposes during development.

对此(请求类型uirement)的“最灵活”解决方案可能是 Profiles

我们可以:

@SpringBootApplication(exclude = {
  SpringDocWebMvcConfiguration.class,
  SpringDocConfiguration.class
})
public class MySpringApp {...

从我们的主配置(默认配置文件)中排除 openapi 配置(因为无论如何它都是被禁止的)。

那我们就介绍一下:

@Configuration
@Profile("documented") // ! this gets only activated/loaded, when "documented" is (one of) spring.aprofiles.active
@Import({
  SpringDocWebMvcConfiguration.class,
  SpringDocConfiguration.class
})
// customize API here ...
class DocConfig {
  // ...and/or here
}

所有我们要“招摇”的控制器,我们也注释为:

@Profile("documented") 
@[Rest]Controller public class MyDevController {
...

不幸的是,我们只能在 bean methods/classes 上使用 @Profile,要根据“请求映射”(方法)使用它,我们必须复制并隔离控制器:

一个有:

@Profile("documented") // work in progress

和原始控制器:

@Profile("!documented") // as in prod

我们必须相互排除它们("documented" vs "!documented"),否则(路径)映射将不明确。


有了这个,运行 我们的生产应用程序(没有“记录的”配置文件)将:

  • 跳过springdoc配置
  • 公开没有:
    • 招摇-ui
    • 无api端点
  • 不加载配置文件“已记录”的任何控制器。

运行 我们的应用程序在 dev/loaclly 中,我们将设置 spring.profiles.active=documented,而 springdoc 将:

  • 公开 ui 和端点:
  • “记录”(和默认!)控制器。