springdoc-openapi v1.8.0 是支持 Spring Boot 2.x 和 1.x 的最新开源版本。
现在为需要 2023 年以后支持的组织提供对 springdoc-openapi v1 项目的扩展支持。
有关更多详细信息,请随时联系:sales@springdoc.org

springdoc-openapiOpen Collective 上。如果您 ❤️ 这个项目,请考虑成为赞助商

本项目由以下机构赞助

  

1. 简介

springdoc-openapi java 库有助于自动化使用 spring boot 项目生成 API 文档。 springdoc-openapi 通过在运行时检查应用程序,根据 spring 配置、类结构和各种注解来推断 API 语义。

自动生成 JSON/YAML 和 HTML 格式的 API 文档。可以使用 swagger-api 注解通过注释完成此文档。

此库支持

  • OpenAPI 3

  • Spring-boot v3(Java 17 & Jakarta EE 9)

  • JSR-303,专门用于 @NotNull、@Min、@Max 和 @Size。

  • Swagger-ui

  • OAuth 2

  • GraalVM native images

以下视频介绍了该库

spring.io conference

这是一个基于社区的项目,不由 Spring Framework Contributors (Pivotal) 维护。

2. 快速入门

为了实现 spring-boot 和 swagger-ui 之间的集成,请将该库添加到项目依赖项列表中(无需其他配置)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
      <version>2.8.5</version>
   </dependency>

这将自动将 swagger-ui 部署到 spring-boot 应用程序

  • 文档将以 HTML 格式提供,使用官方的 swagger-ui jars

  • 然后可以在 http://server:port/context-path/swagger-ui.html 访问 Swagger UI 页面,并且可以在以下 url 获取 json 格式的 OpenAPI 描述:http://server:port/context-path/v3/api-docs

    • server:服务器名称或 IP

    • port:服务器端口

    • context-path:应用程序的上下文路径

  • 文档也可以 yaml 格式提供,路径如下:/v3/api-docs.yaml

对于 HTML 格式的 swagger 文档的自定义路径,请在 spring-boot 配置文件中添加自定义 springdoc 属性:。
# swagger-ui custom path
springdoc.swagger-ui.path=/swagger-ui.html

3. Springdoc-openapi 模块

3.1. 概述

Architecture

3.2. Spring WebMvc 支持

  • 文档将通过以下 url 以 json 格式提供:http://server:port/context-path/v3/api-docs

    • server:服务器名称或 IP

    • port:服务器端口

    • context-path:应用程序的上下文路径

  • 文档也可以 yaml 格式提供,路径如下:/v3/api-docs.yaml

  • 将该库添加到项目依赖项列表中。(无需其他配置)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
      <version>2.8.5</version>
   </dependency>
如果您想生成 OpenAPI 描述而不使用 swagger-ui,则此依赖项是相关的。
对于 Json 格式的 OpenAPI 文档的自定义路径,请在 spring-boot 配置文件中添加自定义 springdoc 属性
# /api-docs endpoint custom path
springdoc.api-docs.path=/api-docs

3.3. Spring WebFlux 支持

  • 文档也可以 yaml 格式提供,路径如下:/v3/api-docs.yaml

  • 将该库添加到项目依赖项列表中(无需其他配置)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-starter-webflux-api</artifactId>
      <version>2.8.5</version>
   </dependency>

3.4. Spring Hateoas 支持

使用依赖项 springdoc-openapi-hateoas 可以获得对 Spring Hateoas 的支持。

使用 spring-boot-starter-hateoas 的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们只需要访问 OpenAPI 端点

  • springdoc-openapi-starter-webmvc-ui,如果他们还需要访问 swagger-ui

3.5. Spring Data Rest 支持

springdoc-openapi 项目支持 spring-boot-starter-data-rest 类型,例如:@RepositoryRestResourceQuerydslPredicate 注解。

使用 spring-boot-starter-data-rest 的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们只需要访问 OpenAPI 端点

  • springdoc-openapi-starter-webmvc-ui,如果他们还需要访问 swagger-ui

3.6. Spring Security 支持

springdoc-openapi 帮助忽略 REST Controller 上使用的 @AuthenticationPrincipal 类型。

springdoc-openapi 还支持公开 spring-security-oauth2-authorization-server 的 Oauth2 端点。

使用 spring-boot-starter-securityspring-security-oauth2-authorization-server 的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们依赖于 spring-boot-starter-web 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webmvc-ui,如果他们依赖于 spring-boot-starter-web 并且他们还需要访问 swagger-ui。

  • springdoc-openapi-starter-webflux-api 如果他们依赖于 spring-boot-starter-webflux 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webflux-ui,如果他们依赖于 spring-boot-starter-webflux 并且他们还需要访问 swagger-ui。

3.7. Actuator 支持

  • 为了显示 spring-boot-actuator 端点,只需添加以下属性

springdoc.show-actuator=true

1.5.1 版本开始,可以在 actuator 端口上公开 swagger-uiopenapi 端点。

actuator 管理端口必须与应用程序端口不同。

要在管理端口上公开 swagger-ui,您应该设置

springdoc.use-management-port=true
# This property enables the openapi and swagger-ui endpoints to be exposed beneath the actuator base path.
management.endpoints.web.exposure.include=openapi, swagger-ui

启用后,您还应该能够看到以下位置下的 springdoc-openapi 端点:(主机和端口取决于您的设置)- http://serverName:managementPort/actuator

例如,如果您有以下设置

将提供两个端点

  1. 包含 OpenAPI 定义的 REST API

    • http://serverName:managementPort/actuator/openapi

  2. 一个路由到 swagger-ui 的端点

    • http://serverName:managementPort/actuator/swagger-ui

management.server.port=9090

对于示例,您还应该能够看到 springdoc-openapi 端点

  • http://serverName:9090/actuator

  • http://serverName:9090/actuator/swagger-ui

  • http://serverName:9090/actuator/openapi

springdoc.use-management-port=true 时,所有路径 springdoc-openapi 属性均不适用。

如果您想从部署在 actuator 基本路径下的 swagger-ui 访问应用程序端点,并使用与应用程序不同的端口,则应在应用程序级别启用 endpointsCORS

此外,还可以将此属性与现有属性结合使用,以在 swagger-ui 中显示 actuator 端点。

springdoc.show-actuator=true

启用后:- 默认情况下将为 actuator 端点添加专用组。- 如果未为应用程序定义组,则将添加默认组。

然后可以通过 actuator 端口访问 swagger-ui

  • http://serverName:managementPort/actuator/swagger-ui

如果管理端口与应用程序端口不同,并且未定义 springdoc.use-management-port,但将 springdoc.show-actuator 设置为 true

  • 然后可以通过应用程序端口访问 swagger-ui。 例如:http://serverName:applicationPort/swagger-ui.html

  • 默认情况下,将为 actuator 端点添加专用组。

  • 如果未为应用程序定义组,则将添加默认组。

如果您想在此情况下(与应用程序不同的端口)访问 actuator 端点,则应为 actuator 端点启用 CORS

注意:目前无法自定义 actuator 基本路径下这些新端点的命名。

3.8. Spring Cloud Function Web 支持

spring-cloud-function-web 自动将 Java Function 公开为 REST 端点。 * 自版本 v1.6.3 以来,已添加对函数式端点的支持。

  • 这些启动器将显示 spring-cloud-function-web 端点的 OpenAPI 描述。

    • 如果您正在使用 spring-web,只需添加 springdoc-openapi-starter-webmvc-ui 依赖项。

    • 如果您正在使用 spring-webflux,只需添加 springdoc-openapi-starter-webflux-ui 依赖项。

输出的自定义可以通过 OpenApiCustomizer 以编程方式实现,也可以使用注解:@RouterOperations@RouterOperation。 对于注解用法,您有:* @RouterOperation:如果自定义与单个 REST API 相关,则可以单独使用。 使用 @RouterOperation 时,不必填写路径

  • @RouterOperation,包含 @Operation 注解。 如果声明了 beanMethod 属性,则 @Operation 注解也可以放置在 bean 方法级别。

不要忘记设置 operationId,这是强制性的。
@Bean
@RouterOperation(operation = @Operation(description = "Say hello", operationId = "hello", tags = "persons",
        responses = @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = PersonDTO.class)))))
public Supplier<PersonDTO> helloSupplier() {
    return () -> new PersonDTO();
}
  • @RouterOperations:此注解应用于描述 spring-cloud-function-web 公开的多个 REST API。 使用 RouterOperations 时,必须填写 method 属性。

  • 一个 @RouterOperations,包含多个 @RouterOperation

@Bean
@RouterOperations({
        @RouterOperation(method = RequestMethod.GET, operation = @Operation(description = "Say hello GET", operationId = "lowercaseGET", tags = "persons")),
        @RouterOperation(method = RequestMethod.POST, operation = @Operation(description = "Say hello POST", operationId = "lowercasePOST", tags = "positions"))
})
public Function<Flux<String>, Flux<String>> lowercase() {
    return flux -> flux.map(value -> value.toLowerCase());
}

一些代码示例在演示的 GITHUB 上可用

3.9. Kotlin 支持

springdoc-openapi 支持 Kotlin 类型。

使用 Kotlin 的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们依赖于 spring-boot-starter-web 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webmvc-ui,如果他们依赖于 spring-boot-starter-web 并且他们还需要访问 swagger-ui。

  • springdoc-openapi-starter-webflux-api 如果他们依赖于 spring-boot-starter-webflux 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webflux-ui,如果他们依赖于 spring-boot-starter-webflux 并且他们还需要访问 swagger-ui。

此外,您的项目还应添加 jackson-module-kotlin 以完全支持 Kotlin 类型
    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
    </dependency>

3.10. Groovy 支持

使用 Groovy 的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们依赖于 spring-boot-starter-web 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webmvc-ui,如果他们依赖于 spring-boot-starter-web 并且他们还需要访问 swagger-ui。

  • springdoc-openapi-starter-webflux-api 如果他们依赖于 spring-boot-starter-webflux 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webflux-ui,如果他们依赖于 spring-boot-starter-webflux 并且他们还需要访问 swagger-ui。

3.11. Javadoc 支持

springdoc-openapi 可以内省 Javadoc 注解和注释

  • 方法的 javadoc 注释:解析为 @Operation 描述

  • @return :解析为 @Operation 响应描述

  • 属性的 javadoc 注释:解析为此字段的“@Schema”描述。

需要 Javadoc 支持的项目应使用

  • springdoc-openapi-starter-webmvc-api 如果他们依赖于 spring-boot-starter-web 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webmvc-ui,如果他们依赖于 spring-boot-starter-web 并且他们还需要访问 swagger-ui。

  • springdoc-openapi-starter-webflux-api 如果他们依赖于 spring-boot-starter-webflux 并且他们只需要访问 OpenAPI 端点。

  • springdoc-openapi-starter-webflux-ui,如果他们依赖于 spring-boot-starter-webflux 并且他们还需要访问 swagger-ui。

此外,您的项目应添加 therapi-runtime-javadoc 以在运行时读取 Javadoc 注释。 确保您同时添加它及其注解处理器到您的项目依赖项中。 否则,Javadoc 支持将静默失败。
    <!--Annotation processor -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>com.github.therapi</groupId>
                            <artifactId>therapi-runtime-javadoc-scribe</artifactId>
                            <version>0.15.0</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!-- Runtime library -->
    <dependency>
        <groupId>com.github.therapi</groupId>
        <artifactId>therapi-runtime-javadoc</artifactId>
        <version>0.15.0</version>
    </dependency>
如果 swagger-annotation 描述和 javadoc 注释都存在。 将使用 swagger-annotation 描述的值。

4. Springdoc-openapi 功能特性

4.1. 添加 API 信息和安全文档

该库使用 spring-boot 应用程序自动配置的包来扫描 spring bean 中的以下注解:OpenAPIDefinition 和 Info。 这些注解声明 API 信息:标题、版本、许可证、安全性、服务器、标签、安全性和 externalDocs。 为了更好地生成文档的性能,请在 spring 管理的 bean 中声明 @OpenAPIDefinition 和 @SecurityScheme 注解。

4.2. 使用 @ControllerAdvice 处理 REST 错误

要自动生成文档,请确保所有方法都使用注解 @ResponseStatus 声明 HTTP 代码响应

4.3. 禁用 springdoc-openapi 端点

为了禁用 springdoc-openapi 端点(默认情况下为 /v3/api-docs),请使用以下属性

# Disabling the /v3/api-docs endpoint
springdoc.api-docs.enabled=false

4.4. 禁用 swagger-ui

为了禁用 swagger-ui,请使用以下属性

# Disabling the swagger-ui
springdoc.swagger-ui.enabled=false

4.5. Swagger-ui 配置

该库支持 swagger-ui 官方属性

您需要将 swagger-ui 属性声明为 spring-boot 属性。 所有这些属性都应使用以下前缀声明:springdoc.swagger-ui

4.6. 选择要包含在文档中的 Rest Controller

除了来自 swagger-annotations 的 @Hidden 注解之外,还可以使用包或路径配置来限制生成的 OpenAPI 描述。

对于要包含的包列表,请使用以下属性

# Packages to include
springdoc.packagesToScan=com.package1, com.package2

对于要包含的路径列表,请使用以下属性

# Paths to include
springdoc.pathsToMatch=/v1, /api/balance/**

4.7. 具有函数式端点的 Spring-webflux/WebMvc.fn

自 v1.5.0 版本以来,由于 spring-framework 中的此增强功能:#25938,引入了函数式 DSL。

它是 @RouterOperations 注解的替代函数式 API。

这是一个示例 DSL,用于为 webflux/WebMvc.fn REST 端点生成 OpenAPI 描述

@Bean
RouterFunction<?> routes() {
    return route().GET("/foo", HANDLER_FUNCTION, ops -> ops
            .operationId("hello")
            .parameter(parameterBuilder().name("key1").description("My key1 description"))
            .parameter(parameterBuilder().name("key2").description("My key2 description"))
            .response(responseBuilder().responseCode("200").description("This is normal response description"))
            .response(responseBuilder().responseCode("404").description("This is another response description"))
    ).build();
}

这是某些示例代码的链接

以及使用函数式端点 DSL 的演示代码

v1.3.8 版本以来,已添加对函数式端点的支持。 为此目的添加了两个主要注解:@RouterOperations@RouterOperation

只有带有 @RouterOperations@RouterOperation 的 REST API 才能在 swagger-ui 上显示。

  • @RouterOperation:如果 Router bean 包含与 REST API 相关的单个路由,则可以单独使用它。 使用 @RouterOperation 时,不必填写路径

  • @RouterOperation,可以直接引用 spring Bean(beanClass 属性)和底层方法(beanMethod 属性):Springdoc-openapi 然后将检查此方法和此方法级别的 swagger 注解。

@Bean
@RouterOperation(beanClass = EmployeeService.class, beanMethod = "findAllEmployees")
RouterFunction<ServerResponse> getAllEmployeesRoute() {
   return route(GET("/employees").and(accept(MediaType.APPLICATION_JSON)),
         req -> ok().body(
               employeeService().findAllEmployees(), Employee.class));
}
  • @RouterOperation,包含 @Operation 注解。 如果声明了 beanMethod 属性,则 @Operation 注解也可以放置在 bean 方法级别。

不要忘记设置 operationId,这是强制性的。
@Bean
@RouterOperation(operation = @Operation(operationId = "findEmployeeById", summary = "Find purchase order by ID", tags = { "MyEmployee" },
      parameters = { @Parameter(in = ParameterIn.PATH, name = "id", description = "Employee Id") },
      responses = { @ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = Employee.class))),
            @ApiResponse(responseCode = "400", description = "Invalid Employee ID supplied"),
            @ApiResponse(responseCode = "404", description = "Employee not found") }))
RouterFunction<ServerResponse> getEmployeeByIdRoute() {
   return route(GET("/employees/{id}"),
         req -> ok().body(
               employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class));
}
  • @RouterOperations:如果 Router bean 包含多个路由,则应使用此注解。 使用 RouterOperations 时,必须填写 path 属性。

  • 一个 @RouterOperations,包含多个 @RouterOperation

@RouterOperations({ @RouterOperation(path = "/getAllPersons", beanClass = PersonService.class, beanMethod = "getAll"),
      @RouterOperation(path = "/getPerson/{id}", beanClass = PersonService.class, beanMethod = "getById"),
      @RouterOperation(path = "/createPerson", beanClass = PersonService.class, beanMethod = "save"),
      @RouterOperation(path = "/deletePerson/{id}", beanClass = PersonService.class, beanMethod = "delete") })
@Bean
public RouterFunction<ServerResponse> personRoute(PersonHandler handler) {
   return RouterFunctions
         .route(GET("/getAllPersons").and(accept(MediaType.APPLICATION_JSON)), handler::findAll)
         .andRoute(GET("/getPerson/{id}").and(accept(MediaType.APPLICATION_STREAM_JSON)), handler::findById)
         .andRoute(POST("/createPerson").and(accept(MediaType.APPLICATION_JSON)), handler::save)
         .andRoute(DELETE("/deletePerson/{id}").and(accept(MediaType.APPLICATION_JSON)), handler::delete);
}

使用 @RouterOperation 填充的所有文档都可以通过路由器函数数据完成。 为此,@RouterOperation 字段必须有助于唯一标识相关路由。 springdoc-openpi 使用以下条件扫描与 @RouterOperation 注解相关的唯一路由

  • 按路径

  • 按路径和 RequestMethod

  • 按路径和 produces

  • 按路径和 consumes

  • 按路径和 RequestMethod 和 produces

  • 按路径和 RequestMethod 和 consumes

  • 按路径和 produces 和 consumes

  • 按路径和 RequestMethod 和 produces 和 consumes

一些代码示例在演示的 GITHUB 上可用

以及一些项目测试:(从 app69 到 app75)

4.8. 与 WildFly 集成

  • 对于 WildFly 用户,您需要添加以下依赖项以使 swagger-ui 工作

   <dependency>
     <groupId>org.webjars</groupId>
     <artifactId>webjars-locator-jboss-vfs</artifactId>
     <version>0.1.0</version>
   </dependency>

5. Springdoc-openapi 属性

springdoc-openapi 依赖于标准 spring 配置属性 (yml 或 properties),使用标准文件位置。

5.1. springdoc-openapi 核心属性

参数名称 默认值 描述

springdoc.api-docs.path

/v3/api-docs

String,用于 Json 格式的 OpenAPI 文档的自定义路径。

springdoc.api-docs.enabled

true

Boolean。 用于禁用 springdoc-openapi 端点(默认情况下为 /v3/api-docs)。

springdoc.packages-to-scan

*

String 列表。 要扫描的包列表(逗号分隔)

springdoc.paths-to-match

/*

String 列表。 要匹配的路径列表(逗号分隔)

springdoc.produces-to-match

/*

String 列表。 要匹配的 produces 媒体类型列表(逗号分隔)

springdoc.headers-to-match

/*

String 列表。 要匹配的标头列表(逗号分隔)

springdoc.consumes-to-match

/*

String 列表。 要匹配的 consumes 媒体类型列表(逗号分隔)

springdoc.paths-to-exclude

String 列表。 要排除的路径列表(逗号分隔)

springdoc.packages-to-exclude

String 列表。 要排除的包列表(逗号分隔)

springdoc.default-consumes-media-type

application/json

String。 默认 consumes 媒体类型。

springdoc.default-produces-media-type

/

String。 默认 produces 媒体类型。

springdoc.cache.disabled

false

Boolean。 用于禁用 springdoc-openapi 计算的 OpenAPI 缓存。

springdoc.show-actuator

false

Boolean。 用于显示 actuator 端点。

springdoc.auto-tag-classes

true

Boolean。 用于禁用 springdoc-openapi 自动标记。

springdoc.model-and-view-allowed

false

Boolean。 允许 OpenAPI 描述中显示带有 ModelAndView 返回的 RestController。

springdoc.override-with-generic-response

true

Boolean。 为 true 时,自动将 @ControllerAdvice 响应添加到所有生成的响应。

springdoc.group-configs[0].group

String。 组名称

springdoc.group-configs[0].display-name

String。 组的显示名称。

springdoc.group-configs[0].packages-to-scan

*

String 列表。 要扫描组的包列表(逗号分隔)

springdoc.group-configs[0].paths-to-match

/*

String 列表。 要匹配组的路径列表(逗号分隔)

springdoc.group-configs[0].paths-to-exclude

``

String 列表。 要排除组的路径列表(逗号分隔)

springdoc.group-configs[0].packages-to-exclude

String 列表。 要排除组的包列表(逗号分隔)

springdoc.group-configs[0].produces-to-match

/*

String 列表。 要匹配的 produces 媒体类型列表(逗号分隔)

springdoc.group-configs[0].consumes-to-match

/*

String 列表。 要匹配的 consumes 媒体类型列表(逗号分隔)

springdoc.group-configs[0].headers-to-match

/*

String 列表。 要匹配的标头列表(逗号分隔)

springdoc.webjars.prefix

/webjars

String。 用于更改 spring-webflux 的 swagger-ui URL 中可见的 webjars 前缀。

springdoc.api-docs.resolve-schema-properties

false

Boolean。 用于在 @Schema 上启用属性解析器(名称、标题和描述)。

springdoc.remove-broken-reference-definitions

true

Boolean。 用于禁用删除损坏的引用定义。

springdoc.writer-with-default-pretty-printer

false

Boolean。 用于启用 OpenApi 规范的格式化打印。

springdoc.model-converters.deprecating-converter.enabled

true

Boolean。 用于禁用弃用模型转换器。

springdoc.model-converters.polymorphic-converter.enabled

true

Boolean。 用于禁用多态模型转换器。

springdoc.model-converters.pageable-converter.enabled

true

Boolean。 用于禁用 pageable 模型转换器。

springdoc.model-converters.sort-converter.enabled

true

Boolean。 用于禁用 Sort 转换器。

springdoc.use-fqn

false

Boolean。 用于启用完全限定名称。

springdoc.show-login-endpoint

false

Boolean。 用于使 spring security login-endpoint 可见。

springdoc.pre-loading-locales

String 列表。 在应用程序启动时加载 OpenAPI 的区域设置列表(逗号分隔)。 如果未指定,它将预加载默认区域设置。

springdoc.writer-with-order-by-keys

false

Boolean。 启用确定性/字母顺序排序。

springdoc.use-management-port

false

Boolean。 用于在 actuator 管理端口上公开 swagger-ui。

springdoc.disable-i18n

false

Boolean。 用于禁用使用 i18n 的自动翻译。

springdoc.show-spring-cloud-functions

true

Boolean。 用于显示 spring-cloud-function web 端点。

springdoc.enable-groovy

true

Boolean。 用于启用 Groovy 支持。

springdoc.enable-spring-security

true

Boolean。 用于启用 spring-security 支持。

springdoc.enable-kotlin

true

Boolean。 用于启用 Kotlin 支持。

springdoc.enable-hateoas

true

Boolean。 用于启用 spring-hateoas 支持。

springdoc.enable-data-rest

true

Boolean。启用 spring-data-rest 支持。

springdoc.api-docs.version

openapi_3_1

String。选择 OpenAPI 3.0OpenAPI 3.1 (使用值 OPENAPI_3_1)。

springdoc.default-flat-param-object

false

Boolean。默认扁平化参数。

springdoc.default-support-form-data

false

Boolean。当指定 api 接受表单数据时,默认将参数设置为表单数据。

springdoc.nullable-request-parameter-enabled

true

Boolean。默认启用 Kotlin 中可为空请求参数的支持。

springdoc.show-oauth2-endpoints

false

Boolean。使 spring security oauth2 端点可见。

springdoc.api-docs.resolve-extensions-properties

false

Boolean。启用 spring 属性解析器对 @ExtensionProperty 的支持。

springdoc.enable-default-api-docs

true

Boolean。启用默认 OpenAPI 端点 /v3/api-docs

springdoc.trim-kotlin-indent

false

Boolean。解析 Kotlin 中的 @Operation 注解时调整缩进。

springdoc.allowed-locales

List of Strings。OpenAPI 允许的语言环境列表(逗号分隔,例如 US,fr-CA)。

5.2. swagger-ui 属性

  • springdoc-openapi 上提供了 swagger-ui 属性的支持。请参阅 官方文档

  • 您可以在文档中使用与 Spring Boot 属性相同的 swagger-ui 属性。

所有这些属性都应使用以下前缀声明:springdoc.swagger-ui
参数名称 默认值 描述

springdoc.swagger-ui.path

/swagger-ui.html

String,用于 swagger-ui HTML 文档的自定义路径。

springdoc.swagger-ui.enabled

true

Boolean。禁用 swagger-ui 端点(默认情况下为 /swagger-ui.html)。

springdoc.swagger-ui.configUrl

/v3/api-docs/swagger-config

String。用于从外部获取配置文档的 URL。

springdoc.swagger-ui.layout

BaseLayout

String。通过插件系统可用的组件名称,用作 Swagger UI 的顶级布局。

springdoc.swagger-ui.validatorUrl

默认情况下,Swagger UI 不会验证规范。您可以使用此参数设置验证器 URL,例如针对 swagger.io 的在线验证器。

springdoc.swagger-ui.tryItOutEnabled

false

Boolean。控制是否默认启用“Try it out”部分。

springdoc.swagger-ui.filter

false

Boolean OR String。如果设置,则启用过滤。顶部栏将显示一个编辑框,您可以使用该编辑框来过滤显示的已标记操作。可以是 Boolean 类型以启用或禁用,也可以是字符串类型,在这种情况下,将使用该字符串作为过滤器表达式启用过滤。过滤区分大小写,匹配标签内任何位置的过滤器表达式。

springdoc.swagger-ui.operationsSorter

Function=(a ⇒ a)。对每个 API 的操作列表应用排序。可以是 'alpha'(按路径字母数字排序)、'method'(按 HTTP 方法排序)或函数(有关排序函数的工作方式,请参阅 Array.prototype.sort())。默认值是服务器返回的顺序,保持不变。

springdoc.swagger-ui.tagsSorter

Function=(a ⇒ a)。对每个 API 的标签列表应用排序。可以是 'alpha'(按路径字母数字排序)或函数 请参阅 Array.prototype.sort() 以了解如何编写排序函数)。每次传递都会将两个标签名称字符串传递给排序器。默认值是 Swagger UI 确定的顺序。

springdoc.swagger-ui.oauth2RedirectUrl

/swagger-ui/oauth2-redirect.html

String。OAuth 重定向 URL。

springdoc.swagger-ui.displayOperationId

false

Boolean。控制操作列表中 operationId 的显示。默认值为 false

springdoc.swagger-ui.displayRequestDuration

false

Boolean。控制“Try it out”请求的请求持续时间(以毫秒为单位)的显示。

springdoc.swagger-ui.deepLinking

false

Boolean。如果设置为 true,则为标签和操作启用深度链接。有关更多信息,请参阅 [深度链接文档](swagger.io/docs/open-source-tools/swagger-ui/usage/deep-linking)。

springdoc.swagger-ui.defaultModelsExpandDepth

1

Number。模型的默认展开深度(设置为 -1 完全隐藏模型)。

springdoc.swagger-ui.defaultModelExpandDepth

1

Number。模型示例部分中模型的默认展开深度。

springdoc.swagger-ui.defaultModelRendering

String=["example"*, "model"]。控制首次呈现 API 时模型的显示方式。(用户始终可以通过单击“Model”和“Example Value”链接来切换给定模型的呈现方式。)

springdoc.swagger-ui.docExpansion

String=["list"*, "full", "none"]。控制操作和标签的默认展开设置。可以是 'list'(仅展开标签)、'full'(展开标签和操作)或 'none'(不展开任何内容)。

springdoc.swagger-ui.maxDisplayedTags

Number。如果设置,则将显示的已标记操作数限制为最多这么多。默认值是显示所有操作。

springdoc.swagger-ui.showExtensions

false

Boolean。控制操作、参数和 Schema 的供应商扩展 (x-) 字段和值的显示。

springdoc.swagger-ui.url

String。要配置自定义 OpenAPI 文件的路径。如果使用 urls,则将被忽略。

springdoc.swagger-ui.showCommonExtensions

false

Boolean。控制参数的扩展 (pattern, maxLength, minLength, maximum, minimum) 字段和值的显示。

springdoc.swagger-ui.supportedSubmitMethods

Array=[get, put, post, delete, options, head, patch, trace]。启用了“Try it out”功能的 HTTP 方法列表。空数组禁用所有操作的“Try it out”。这不会从显示中过滤掉操作。

springdoc.swagger-ui.queryConfigEnabled

false

Boolean。自 v1.6.0 起禁用。此参数启用(旧版)通过 URL 搜索参数覆盖配置参数。请在启用此功能之前查看安全建议

springdoc.swagger-ui.oauth. additionalQueryStringParams

String。添加到 authorizationUrl 和 tokenUrl 的其他查询参数。

springdoc.swagger-ui.disable-swagger-default-url

false

Boolean。禁用 swagger-ui 默认 petstore url。(自 v1.4.1 起可用)。

springdoc.swagger-ui.urls[0].url

URL。swagger 组的 url,由 Topbar 插件使用。URLs 在此数组中的所有项中必须是唯一的,因为它们用作标识符。

springdoc.swagger-ui.urls[0].name

String。swagger 组的名称,由 Topbar 插件使用。Names 在此数组中的所有项中必须是唯一的,因为它们用作标识符。

springdoc.swagger-ui.urlsPrimaryName

String。Swagger UI 加载时将显示的 swagger 组的名称。

springdoc.swagger-ui.oauth.clientId

String。默认 clientId。必须是字符串。

springdoc.swagger-ui.oauth.clientSecret

String。默认 clientSecret。永远不要在您的生产环境中使用此参数。它会暴露关键的安全信息。此功能仅适用于开发/测试环境。

springdoc.swagger-ui.oauth.realm

String。realm 查询参数(对于 OAuth 1)添加到 authorizationUrl 和 tokenUrl。

springdoc.swagger-ui.oauth.appName

String。OAuth 应用程序名称,显示在授权弹出窗口中。

springdoc.swagger-ui.oauth.scopeSeparator

String。用于传递作用域的 OAuth 作用域分隔符,在调用之前进行编码,默认值为空格(编码值 %20)。

springdoc.swagger-ui.csrf.enabled

false

Boolean。启用 CSRF 支持

springdoc.swagger-ui.csrf.use-local-storage

false

Boolean。从本地存储获取 CSRF 令牌。

springdoc.swagger-ui.csrf.use-session-storage

false

Boolean。从会话存储获取 CSRF 令牌。

springdoc.swagger-ui.csrf.cookie-name

XSRF-TOKEN

String。可选 CSRF,用于设置 CSRF cookie 名称。

springdoc.swagger-ui.csrf.header-name

X-XSRF-TOKEN

String。可选 CSRF,用于设置 CSRF 标头名称。

springdoc.swagger-ui.syntaxHighlight.activated

true

Boolean。是否应激活语法高亮。

springdoc.swagger-ui.syntaxHighlight.theme

agate

StringString=["agate"*, "arta", "monokai", "nord", "obsidian", "tomorrow-night"]Highlight.js 语法着色主题,用于使用。(仅提供这 6 种样式。)

springdoc.swagger-ui.oauth. useBasicAuthentication WithAccessCodeGrant

false

Boolean。仅针对 accessCode 流激活。在对 tokenUrl 的 authorization_code 请求期间,使用 HTTP 基本身份验证方案传递客户端密码(带有 Basic base64encode(client_id + client_secret) 的 Authorization 标头)。

springdoc.swagger-ui.oauth. usePkceWithAuthorization CodeGrant

false

Boolean。仅适用于 authorizatonCode 流。代码交换的证明密钥为 OAuth 公共客户端带来了增强的安全性。

springdoc.swagger-ui.persistAuthorization

false

Boolean。如果设置为 true,则会持久化授权数据,并且在浏览器关闭/刷新时不会丢失

springdoc.swagger-ui.use-root-path

false

Boolean。如果设置为 true,则可以直接从应用程序根路径访问 swagger-ui。

6. Springdoc-openapi 插件

6.1. Maven 插件

springdoc-openapi-maven-plugin 的目的是在构建时生成 json 和 yaml OpenAPI 描述。该插件在 integration-tests 阶段工作,并生成 OpenAPI 描述。该插件与 spring-boot-maven 插件协同工作。

您可以在集成测试阶段使用 maven 命令对其进行测试

mvn verify

为了使用此功能,您需要在 pom.xml 的 plugins 部分添加插件声明

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>${spring-boot-maven-plugin.version}</version>
    <configuration>
        <jvmArguments>-Dspring.application.admin.enabled=true</jvmArguments>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>start</goal>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-maven-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <id>integration-test</id>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
</plugin>

有关 springdoc-openapi-maven-plugin 的更多自定义设置,您可以查阅插件文档

6.2. Gradle 插件

此插件允许您从 Gradle 构建为 Spring Boot 应用程序生成 OpenAPI 3 规范。

plugins {
      id("org.springframework.boot") version "3.1.2"
      id("org.springdoc.openapi-gradle-plugin") version "1.9.0"
}

当您将此插件及其运行时依赖插件添加到构建文件时,该插件会创建以下任务

  • forkedSpringBootRun

  • generateOpenApiDocs

gradle clean generateOpenApiDocs

有关 springdoc-openapi-gradle-plugin 的更多自定义配置,您可以查阅插件文档

8. 从 springdoc-openapi v1 迁移

所有模块都已重命名。springdoc-openapi-starter-common 集成了许多 spring 模块支持,以最大限度地隐藏复杂性。它允许开箱即用地支持 Actuator / Spring Cloud Function / Spring Data Rest/ Spring Native/ Spring Hateoas / Spring Securtiy / Kotlin/ Javadoc

下表描述了主要模块的更改

springdoc-openapi-v1 springdoc-openapi-v2 描述

springdoc-openapi-common

springdoc-openapi-starter-common

包括基础 springdoc-openapi 功能

springdoc-openapi-data-rest

springdoc-openapi-starter-common

用于 Spring Data Rest 支持

springdoc-openapi-groovy

springdoc-openapi-starter-common

用于 Groovy 支持

springdoc-openapi-hateoas

springdoc-openapi-starter-common

用于 Spring Hateoas 支持

springdoc-openapi-javadoc

springdoc-openapi-starter-common

用于 Javadoc 支持

springdoc-openapi-kotlin

springdoc-openapi-starter-common

用于 Kotlin 支持

springdoc-openapi-security

springdoc-openapi-starter-common

用于 Spring Security 支持

springdoc-openapi-webmvc-core

springdoc-openapi-starter-webmvc-api

用于 Spring WebMvc 支持

springdoc-openapi-webflux-core

springdoc-openapi-starter-webflux-api

用于 Spring WebFlux 支持

springdoc-openapi-ui

springdoc-openapi-starter-webmvc-ui

用于在 Spring WebMvc 上下文中使用 Swagger-UI

springdoc-openapi-webflux-ui

springdoc-openapi-starter-webflux-ui

用于在 Spring WebFlux 上下文中使用 Swagger-UI

类/注解更改
springdoc-openapi-v1 springdoc-openapi-v2

org.springdoc.core.SpringDocUtils

org.springdoc.core.utils.SpringDocUtils

org.springdoc.api.annotations.ParameterObject

org.springdoc.core.annotations.ParameterObject

org.springdoc.core.GroupedOpenApi

org.springdoc.core.models.GroupedOpenApi

org.springdoc.core.customizers.OpenApiCustomiser

org.springdoc.core.customizers.OpenApiCustomizer

org.springdoc.core.Constants

org.springdoc.core.utils.Constants

org.springdoc.core.SwaggerUiConfigParameters

org.springdoc.core.properties.SwaggerUiConfigParameters

迁移提示

以下模块不再需要,可以删除

  • springdoc-openapi-javadoc

  • springdoc-openapi-kotlin

  • springdoc-openapi-data-rest

  • springdoc-openapi-security

  • springdoc-openapi-webmvc-core

  • springdoc-openapi-webflux-core

  • springdoc-openapi-hateoas

  • springdoc-openapi-groovy

此外

  • springdoc-openapi-ui 替换为 springdoc-openapi-starter-webmvc-ui

  • springdoc-openapi-webflux-ui 替换为 springdoc-openapi-starter-webflux-ui

9. 从 SpringFox 迁移

  • 删除 springfox 和 swagger 2 依赖项。改为添加 springdoc-openapi-starter-webmvc-ui 依赖项。

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
      <version>2.8.5</version>
   </dependency>
  • 将 swagger 2 注解替换为 swagger 3 注解(它已包含在 springdoc-openapi-starter-webmvc-ui 依赖项中)。swagger 3 注解的包是 io.swagger.v3.oas.annotations

    • @Api@Tag

    • @ApiIgnore@Parameter(hidden = true)@Operation(hidden = true)@Hidden

    • @ApiImplicitParam@Parameter

    • @ApiImplicitParams@Parameters

    • @ApiModel@Schema

    • @ApiModelProperty(allowEmptyValue = true)@Schema(nullable = true)

    • @ApiModelProperty@Schema

    • @ApiOperation(value = "foo", notes = "bar")@Operation(summary = "foo", description = "bar")

    • @ApiParam@Parameter

    • @ApiResponse(code = 404, message = "foo")@ApiResponse(responseCode = "404", description = "foo")

  • 此步骤是可选的:仅当您有多个 Docket bean 时,才将它们替换为 GroupedOpenApi bean。

之前

  @Bean
  public Docket publicApi() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.basePackage("org.github.springshop.web.public"))
              .paths(PathSelectors.regex("/public.*"))
              .build()
              .groupName("springshop-public")
              .apiInfo(apiInfo());
  }

  @Bean
  public Docket adminApi() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.basePackage("org.github.springshop.web.admin"))
              .paths(PathSelectors.regex("/admin.*"))
              .apis(RequestHandlerSelectors.withMethodAnnotation(Admin.class))
              .build()
              .groupName("springshop-admin")
              .apiInfo(apiInfo());
  }

现在

  @Bean
  public GroupedOpenApi publicApi() {
      return GroupedOpenApi.builder()
              .group("springshop-public")
              .pathsToMatch("/public/**")
              .build();
  }
  @Bean
  public GroupedOpenApi adminApi() {
      return GroupedOpenApi.builder()
              .group("springshop-admin")
              .pathsToMatch("/admin/**")
              .addOpenApiMethodFilter(method -> method.isAnnotationPresent(Admin.class))
              .build();
  }

如果您只有一个 Docket — 删除它,并在您的 application.properties 中添加属性

springdoc.packagesToScan=package1, package2
springdoc.pathsToMatch=/v1, /api/balance/**
  • 添加 OpenAPI 类型的 bean。请参见示例

  @Bean
  public OpenAPI springShopOpenAPI() {
      return new OpenAPI()
              .info(new Info().title("SpringShop API")
              .description("Spring shop sample application")
              .version("v0.0.1")
              .license(new License().name("Apache 2.0").url("https://springdoc.springframework.org.cn")))
              .externalDocs(new ExternalDocumentation()
              .description("SpringShop Wiki Documentation")
              .url("https://springshop.wiki.github.org/docs"));
  }

10. 其他资源

springdoc-openapiOpen Collective 上。

如果您 ❤️ 这个项目,请考虑成为 赞助商

这笔钱用于支付项目费用,您的捐款将帮助项目成功生存和发展。

感谢我们的青铜赞助商!

  

11.1. 成为青铜赞助商的好处

青铜赞助商每月向项目捐赠 50 美元,并获得以下好处

  • 您将收到赞助商徽章 🎖!在 springdoc.org 的首页的 welcome 页面上可见(2022 年 5 月的浏览量约为 55,000 次/月)。

  • 来自“springdoc 团队”的“谢谢”推文。

11.2. 成为白银赞助商的好处

白银赞助商每月向项目捐赠 100 美元,并获得以下好处

  • 与青铜赞助商相同的好处(在主页上可见,以及感谢推文)。

  • 每月可以获得 2 个 issues 的支持,不可转让。

  • 如果 issues 在月底之前未创建,则会丢失

11.3. 成为黄金赞助商的好处

黄金赞助商每月向项目捐赠 500 美元,并获得以下好处

  • 与白银赞助商相同的好处(在主页上可见,以及感谢推文)。

  • 每月可以获得 10 个 issues 的支持,不可转让。

  • 公司徽标显示在所有 springdoc.org 页面页脚上

  • 如果 issues 在月底之前未创建,则剩余的 issues 将丢失。

12. 特别感谢

  • 感谢 Spring 团队 分享所有关于 Spring 项目的相关资源。

  • 非常感谢 JetBrains 对 springdoc-openapi 项目的支持。

JetBrains

13. 常见问题解答

13.1. 如何在一个 Spring Boot 项目中定义多个 OpenAPI 定义?

您可以根据 API 路径和要扫描的包的组合来定义自己的 API 组。每个组都应具有唯一的 groupName。此组的 OpenAPI 描述默认情况下将在以下位置可用

  • http://server:port/context-path/v3/api-docs/groupName

要启用对多个 OpenAPI 定义的支持,需要定义 GroupedOpenApi 类型的 bean。

对于以下组定义(基于包路径),OpenAPI 描述 URL 将为:/v3/api-docs/stores

@Bean
public GroupedOpenApi storeOpenApi() {
   String paths[] = {"/store/**"};
   return GroupedOpenApi.builder().group("stores").pathsToMatch(paths)
         .build();
}

对于以下组定义(基于包名称),OpenAPI 描述 URL 将为:/v3/api-docs/users

@Bean
public GroupedOpenApi userOpenApi() {
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user"};
   return GroupedOpenApi.builder().group("users").packagesToScan(packagesToscan)
         .build();
}

对于以下组定义(基于路径),OpenAPI 描述 URL 将为:/v3/api-docs/pets

@Bean
public GroupedOpenApi petOpenApi() {
   String paths[] = {"/pet/**"};
   return GroupedOpenApi.builder().group("pets").pathsToMatch(paths)
         .build();
}

对于以下组定义(基于包名称和路径),OpenAPI 描述 URL 将为:/v3/api-docs/groups

@Bean
public GroupedOpenApi groupOpenApi() {
   String paths[] = {"/v1/**"};
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user", "test.org.springdoc.api.app68.api.store"};
   return GroupedOpenApi.builder().group("groups").pathsToMatch(paths).packagesToScan(packagesToscan)
         .build();
}

有关使用详情,您可以查看以下示例测试

13.2. 如何配置 Swagger UI?

  • springdoc-openapi 上提供了 swagger 官方属性的支持。请参阅 官方文档

  • 您可以在文档中使用与 swagger 属性相同的 Spring Boot 属性。

所有这些属性都应使用以下前缀声明:springdoc.swagger-ui

13.3. 如何通过提供的组过滤输出规范中记录的资源?

  • 您可以使用标准的 swagger-ui 属性过滤器。

springdoc.swagger-ui.filter=group-a

13.4. 如何基于环境变量禁用/启用 Swagger UI 生成?

  • 此属性可帮助您仅禁用 UI。

springdoc.swagger-ui.enabled=false

13.5. 如何在 Swagger UI 中控制操作和标签的默认展开设置?

  • 您可以在 application.yml 中设置此属性,例如

springdoc.swagger-ui.doc-expansion= none

13.6. 如何更改 swagger-ui 的布局?

  • 对于布局选项,您可以使用 swagger-ui 配置选项。例如

springdoc.swagger-ui.layout=BaseLayout

13.7. 如何按字母顺序对端点进行排序?

  • 您可以使用以下 springdoc-openapi 属性

#For sorting endpoints alphabetically
springdoc.swagger-ui.operationsSorter=alpha
#For sorting tags alphabetically
springdoc.swagger-ui.tagsSorter=alpha

13.8. 如何禁用 try it out 按钮?

  • 您必须设置以下属性

springdoc.swagger-ui.supportedSubmitMethods=get, put, post, delete, options, head, patch, trace

13.9. 如何添加可重用枚举?

  • 您应该在枚举上添加 @Schema(enumAsRef = true)

13.10. 如何将 enumAsRef = true 应用于所有枚举?

  • 声明以下属性

static {
    io.swagger.v3.core.jackson.ModelResolver.enumsAsRef = true;
}

13.11. 如何显式设置要过滤的路径?

  • 您可以使用以下属性设置要包含的路径列表

springdoc.pathsToMatch=/v1, /api/balance/**

13.12. 如何显式设置要扫描的包?

  • 您可以使用以下属性设置要包含的包列表

springdoc.packagesToScan=package1, package2

13.13. 如何以编程方式设置 Swagger 属性?

可以通过创建如下所示的 swaggerUiConfig bean 来设置这些属性

@Bean
@Primary
fun swaggerUiConfig(config: SwaggerUiConfigProperties): SwaggerUiConfigProperties {
    config.showCommonExtensions = true
    config.queryConfigEnabled = true
    return config
}

13.14. 如何忽略模型的某些字段?

  • 您可以在要隐藏的字段顶部使用以下注解

  • @Schema(hidden = true)

13.15. 如何忽略来自 spring-security 的 @AuthenticationPrincipal 参数?

  • 一个解决方案是使用:@Parameter(hidden = true)

  • 使用 spring-boot-starter-securityspring-security-oauth2-authorization-server 的项目应使用

    • springdoc-openapi-starter-webmvc-api 如果他们依赖于 spring-boot-starter-web 并且他们只需要访问 OpenAPI 端点。

    • springdoc-openapi-starter-webmvc-ui,如果他们依赖于 spring-boot-starter-web 并且他们还需要访问 swagger-ui。

    • springdoc-openapi-starter-webflux-api 如果他们依赖于 spring-boot-starter-webflux 并且他们只需要访问 OpenAPI 端点。

    • springdoc-openapi-starter-webflux-ui,如果他们依赖于 spring-boot-starter-webflux 并且他们还需要访问 swagger-ui。

13.16. 是否有可用的 Gradle 插件?

  • 是的。更多详细信息可在 gradle 插件 部分中找到。

13.17. 如何从文档中隐藏参数?

  • 您可以使用 @Parameter(hidden = true)

13.18. 是否支持 @Parameters 注解?

  • 是的

13.19. springdoc-openapi 是否支持 Jersey?

13.20. springdoc-openapi 是否可以仅为 @RestController 生成 API?

  • @RestController 相当于类型级别的 @Controller + @RequestMapping

  • 对于某些旧版应用程序,我们仍然需要支持两者。

  • 如果您需要隐藏类型级别的 @Controller,在这种情况下,您可以在控制器级别使用:@Hidden

  • 请注意,此注解也可用于从生成的文档中隐藏某些方法。

13.21. 是否支持以下验证注解:@NotEmpty @NotBlank @PositiveOrZero @NegativeOrZero

  • 是的

13.22. 如何将 Pageable (spring-data-commons) 对象映射到 Swagger UI 中的正确 URL 参数?

springdoc-openapi v1.6.0 起,开箱即用地支持 spring-data-commons 的 Pageable。为此,您必须将 @ParameterObject 注解与 Pageable 类型结合使用。

springdoc-openapi v1.6.0 之前

  • 对于 HTTP GET 方法,您也可以使用 @ParameterObject 代替 @PageableAsQueryParam

static {
    getConfig().replaceParameterObjectWithClass(org.springframework.data.domain.Pageable.class, Pageable.class)
            .replaceParameterObjectWithClass(org.springframework.data.domain.PageRequest.class, Pageable.class);
}
  • 另一种解决方案是手动配置 Pageable

    • 您将必须显式声明 Pageable 字段作为查询参数的映射,并在您的 pageable 参数上添加 @Parameter(hidden = true) Pageable pageable

    • 您还应该在方法级别声明 springdoc-openapi 提供的注解 @PageableAsQueryParam,或者如果需要定义自定义描述、defaultValue 等,则声明您自己的注解。

如果您想禁用对 spring Pageable Type 的支持,可以使用

springdoc.model-converters.pageable-converter.enabled=false
属性 springdoc.model-converters.pageable-converter.enabled 仅自 v1.5.11+ 起可用

13.23. 如何在生成的描述中生成枚举?

  • 您可以向 @Parameter 添加属性 allowableValues。例如

@GetMapping("/example")
public Object example(@Parameter(name ="json", schema = @Schema(description = "var 1",type = "string", allowableValues = {"1", "2"}))
String json) {
   return null;
}
  • 或者您可以覆盖枚举上的 toString

@Override
@JsonValue
public String toString() {
   return String.valueOf(action);
}

13.24. 如何在反向代理后面部署 springdoc-openapi-starter-webmvc-ui

  • 如果您的应用程序在代理、负载均衡器或云中运行,则请求信息(例如主机、端口、方案…​)可能会在途中更改。您的应用程序可能在 10.10.10.10:8080 上运行,但 HTTP 客户端应该只看到 example.org

  • RFC7239 "Forwarded Headers" 定义了 Forwarded HTTP 标头;代理可以使用此标头来提供有关原始请求的信息。您可以配置应用程序以读取这些标头,并在创建链接并将其发送给 HTTP 302 响应、JSON 文档或 HTML 页面中的客户端时自动使用该信息。还有非标准标头,例如 X-Forwarded-HostX-Forwarded-PortX-Forwarded-ProtoX-Forwarded-SslX-Forwarded-Prefix

  • 如果代理添加了常用的 X-Forwarded-ForX-Forwarded-Proto headers,则将 server.forward-headers-strategy 设置为 NATIVE 就足以支持这些标头。使用此选项,Web 服务器本身原生支持此功能;您可以查看其特定文档以了解特定行为。

  • 您需要确保在反向代理配置中设置了以下标头:X-Forwarded-Prefix

  • 例如,使用 Apache 2,配置

RequestHeader set X-Forwarded-Prefix "/custom-path"
  • 然后,在您的 Spring Boot 应用程序中,确保您的应用程序处理此标头:X-Forwarded-For。有两种方法可以实现此目的

server.use-forward-headers=true
  • 如果这还不够,Spring Framework 提供了 ForwardedHeaderFilter。您可以通过将 server.forward-headers-strategy 设置为 FRAMEWORK 在您的应用程序中将其注册为 Servlet 过滤器。

  • 自 Spring Boot 2.2 起,这是处理反向代理标头的新属性

server.forward-headers-strategy=framework
  • 您可以将以下 bean 添加到您的应用程序

@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
   return new ForwardedHeaderFilter();
}
  • 如果您需要手动调整 Swagger UI 中显示的 URL,请实现 ServerBaseUrlCustomizer 接口。例如,这可能是删除端口号所必需的。

@Bean
public class CustomServerBaseUrlCustomizer implements ServerBaseUrlCustomizer {
    @Override
    public String customize(String serverBaseUrl) {
        try {
            URL url = new URL(serverBaseUrl);
            if (url.getHost().contains(".com")) {
                serverBaseUrl = new URL(url.getProtocol(),url.getHost(),url.getFile()).toString();
            }
        } catch (MalformedURLException ex) {
            // nothing we can do
        }

        return serverBaseUrl;
    }
}

13.25. Spring MVC API 中是否支持 @JsonView 注解?

  • 是的

13.26. 添加 springdoc-openapi-starter-webmvc-ui 依赖项破坏了我的 public/index.html 欢迎页面

  • 如果您已经在根目录下有静态内容,并且不希望它被 springdoc-openapi-starter-webmvc-ui 配置覆盖,您可以只定义 swagger-ui 的自定义配置,以便不覆盖上下文根目录中文件的配置

  • 例如使用

springdoc.swagger-ui.path= /swagger-ui/api-docs.html

13.28. 如何自定义 OpenAPI 对象?

@Bean
public OpenApiCustomizer consumerTypeHeaderOpenAPICustomizer() {
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
    .forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myConsumerTypeHeader")));
}
此 bean OpenApiCustomizer 将仅应用于默认 OpenAPI。

如果您需要将 OpenApiCustomizer 也应用于 GroupedOpenApi,请改用 GlobalOpenApiCustomizer

13.29. 如何返回空内容作为响应?

  • 可以使用以下语法之一将空内容作为响应处理

  • content = @Content

  • content = @Content(schema = @Schema(hidden = true))

  • 例如

@Operation(summary = "Get thing", responses = {
      @ApiResponse(description = "Successful Operation", responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class))),
      @ApiResponse(responseCode = "404", description = "Not found", content = @Content),
      @ApiResponse(responseCode = "401", description = "Authentication Failure", content = @Content(schema = @Schema(hidden = true))) })
@RequestMapping(path = "/testme", method = RequestMethod.GET)
ResponseEntity<String> testme() {
   return ResponseEntity.ok("Hello");
}

13.30. 如何支持具有多种消费媒体类型的端点?

  • 同一类上具有相同 HTTP 方法和路径的重载方法将仅生成一个 OpenAPI 操作。

  • 此外,建议在其中一个重载方法级别使用 @Operation。否则,如果在同一重载方法中多次声明,则可能会被覆盖。

13.31. 如何在编译时获取 yaml 和 json (OpenAPI)?

13.32. 文档中忽略的类型有哪些?

13.33. 如何禁用忽略的类型

如果您不想忽略类型 PrincipalLocaleHttpServletRequest 和其他类型,

SpringDocUtils.getConfig().removeRequestWrapperToIgnore(HttpServletRequest.class)

13.34. 如何在请求中添加授权标头?

  • 您应该将 @SecurityRequirement 标签添加到受保护的 API。

  • 例如

@Operation(security = { @SecurityRequirement(name = "bearer-key") })
  • 以及安全定义示例

@Bean
 public OpenAPI customOpenAPI() {
   return new OpenAPI()
          .components(new Components()
          .addSecuritySchemes("bearer-key",
          new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")));
}

13.35. 与 Springfox 项目的区别

  • OAS 3 于 2017 年 7 月发布,而 springfox 并没有发布版本来支持 OAS 3。springfox 目前仅涵盖 swagger 2 与 Spring Boot 的集成。最新的发布日期是 2018 年 6 月。因此,就维护而言,最近非常缺乏支持。

  • 我们决定向前迈进,并与社区分享我们已经在内部项目中使用的库。

  • springfox 最大的区别在于,我们集成了 springfox 未涵盖的新功能

  • Spring Boot 和 OpenAPI 3 标准之间的集成。

  • 我们仅依赖于 swagger-annotationsswagger-ui 官方库。

  • 我们支持 Spring 5 上的新功能,例如带有注解和函数式风格的 spring-webflux

  • 我们尽最大努力回答所有问题并解决所有问题或增强请求

13.36. 如何使用 springdoc-openapi 迁移到 OpenAPI 3

  • springdoc-openapispringfox 之间没有关系。如果您想迁移到 OpenAPI 3

  • 删除所有 springfox 的依赖项和相关代码

  • 添加 springdoc-openapi-starter-webmvc-ui 依赖项

  • 如果您不想从根路径提供 UI,或者与现有配置存在冲突,您可以更改以下属性

springdoc.swagger-ui.path=/you-path/swagger-ui.html

13.37. 如何设置全局标头?

  • 您可能具有带有标准 OpenAPI 描述的全局参数。

  • 如果您需要定义全局显示(在每个组中),无论组是否满足 GroupedOpenApi 上指定的条件,您都可以使用 OpenAPI Bean。

  • 您可以在全局组件部分的 parameters 下定义公共参数,并通过 $ref 在其他地方引用它们。您还可以定义全局标头参数。

  • 为此,您可以覆盖 OpenAPI Bean,并在组件级别设置全局标头或参数定义。

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
 return new OpenAPI()
        .components(new Components().addSecuritySchemes("basicScheme", new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic"))
        .addParameters("myHeader1", new Parameter().in("header").schema(new StringSchema()).name("myHeader1")).addHeaders("myHeader2", new Header().description("myHeader2 header").schema(new StringSchema())))
        .info(new Info()
        .title("Petstore API")
        .version(appVersion)
        .description("This is a sample server Petstore server. You can find out more about Swagger at [https://swagger.org.cn](https://swagger.org.cn) or on [irc.freenode.net, #swagger](https://swagger.org.cn/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.")
        .termsOfService("https://swagger.org.cn/terms/")
        .license(new License().name("Apache 2.0").url("https://springdoc.springframework.org.cn")));
}

13.38. 是否支持回调?

  • 是的

13.39. 如何定义 SecurityScheme?

  • 您可以使用:@SecurityScheme 注解。

  • 或者您可以通过覆盖 OpenAPI Bean 以编程方式定义它

 @Bean
 public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
  return new OpenAPI()
   .components(new Components().addSecuritySchemes("basicScheme",
   new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic")))
   info(new Info().title("SpringShop API").version(appVersion)
   .license(new License().name("Apache 2.0").url("https://springdoc.springframework.org.cn")));
 }

13.40. 如何从文档中隐藏操作或控制器?

  • 您可以在 @RestController@RestControllerAdvice 和方法级别使用 @io.swagger.v3.oas.annotations.Hidden 注解

  • @ControllerAdvice 异常处理程序构建通用(错误)响应时,会考虑异常处理程序方法上的 @Hidden 注解。

  • 或使用:@Operation(hidden = true)

13.41. 如何配置全局安全方案?

  • 对于全局 SecurityScheme,您可以将其添加到您自己的 OpenAPI 定义中

@Bean
public OpenAPI customOpenAPI() {
    return new OpenAPI().components(new Components()
    .addSecuritySchemes("basicScheme", new SecurityScheme()
    .type(SecurityScheme.Type.HTTP).scheme("basic"))).info(new Info().title("Custom API")
    .version("100")).addTagsItem(new Tag().name("mytag"));
}

13.42. 我可以在 swagger 注解中使用 spring 属性吗?

  • @Info 的 spring 属性解析器支持:title * description * version * termsOfService

  • @Info.license 的 spring 属性解析器支持:name * url

  • @Info.contact 的 spring 属性解析器支持:name * email * url

  • @Operation 的 spring 属性解析器支持:description * summary

  • @Parameter 的 spring 属性解析器支持:description * name

  • @ApiResponse 的 spring 属性解析器支持:description

  • 也可以为 @OAuthFlow 声明安全 URL:openIdConnectUrl * authorizationUrl * refreshUrl * tokenUrl

  • 通过将 springdoc.api-docs.resolve-schema-properties 设置为 true,对 @Schema 的 spring 属性解析器支持:name * title * description

  • 通过将 springdoc.api-docs.resolve-extensions-properties 设置为 true,对 @ExtensionProperty 的 spring 属性解析器支持

13.43. 服务器 URL 是如何生成的?

  • 如果文档不存在,则自动生成服务器 URL 可能很有用。

  • 如果存在服务器注解,则将改用它们。

13.44. 如何禁用 springdoc-openapi 缓存?

  • 默认情况下,OpenAPI 描述计算一次,然后被缓存。

  • 有时,同一个 swagger-ui 在内部和外部代理后面提供服务。一些用户希望在每次 http 请求时计算服务器 URL。

  • 为了禁用 springdoc 缓存,您将必须设置以下属性

springdoc.cache.disabled= true

13.45. 如何在不使用 swagger-ui 的情况下公开 mvc api-docs 端点?

  • 您应该仅使用 springdoc-openapi-core 依赖项

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
  <version>latest.version</version>
</dependency>

13.46. 如何禁用 springdoc-openapi 端点?

  • 使用以下属性

springdoc.api-docs.enabled=false

13.47. 如何隐藏响应的 Schema?

  • 要使用 @Schema 注解隐藏响应元素,请在操作级别执行以下操作

@Operation(responses = @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(hidden = true))))
  • 或直接在 @ApiResponses 级别

@ApiResponses(value = {@ApiResponse(responseCode = "200", content = @Content(schema = @Schema(hidden = true))) })
OR
@ApiResponse(responseCode = "404", description = "Not found", content = @Content)

13.48. 当我设置不同的上下文路径时,swagger-ui 的 URL 是什么?

  • 如果您使用不同的上下文路径

server.servlet.context-path= /foo
  • swagger-ui 将在以下 URL 上可用

    • http://server:port/foo/swagger-ui.html

13.49. 我可以以编程方式自定义 OpenAPI 对象吗?

  • 您可以定义自己的 OpenAPI Bean:如果您需要定义全局显示(在每个组中),无论组是否满足 GroupedOpenApi 上指定的条件,您都可以使用 OpenAPI Bean。

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
   return new OpenAPI()
    .components(new Components().addSecuritySchemes("basicScheme",
            new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic")))
    .info(new Info().title("SpringShop API").version(appVersion)
            .license(new License().name("Apache 2.0").url("https://springdoc.springframework.org.cn")));
}
  • 如果您需要在特定组中显示定义,并遵守 GroupedOpenApi 上指定的条件,您可以将 OpenApiCustomizer 添加到您的 GroupedOpenApi 定义中。

GroupedOpenApi.builder().group("users").pathsToMatch(paths).packagesToScan(packagedToMatch).addOpenApiCustomizer(customerGlobalHeaderOpenApiCustomizer())
                .build()

@Bean
public OpenApiCustomizer customerGlobalHeaderOpenApiCustomizer() {
   return openApi -> openApi.path("/foo",
   new PathItem().get(new Operation().operationId("foo").responses(new ApiResponses()
   .addApiResponse("default",new ApiResponse().description("")
   .content(new Content().addMediaType("fatz", new MediaType()))))));
}

13.50. 在哪里可以找到演示应用程序的源代码?

13.51. 此库是否支持来自接口的注解?

  • 是的

13.53. 是否支持文件上传?

  • 该库支持主要文件类型:MultipartFile@RequestPartFilePart

  • 您可以按如下方式上传文件

import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Encoding;
import io.swagger.v3.oas.annotations.parameters.RequestBody;

@PostMapping(value = "/upload", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<?> upload(@Parameter(description = "file") final MultipartFile file) {
    return null;
}

@PostMapping(value = "/uploadFileWithQuery", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public ResponseEntity<?> uploadFileWithQuery(@Parameter(description = "file") @RequestPart("file") final MultipartFile file,
        @Parameter(description = "An extra query parameter") @RequestParam String name) {
    return null;
}

@PostMapping(value = "/uploadFileWithJson", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}, produces = {
        MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<?> uploadFileWithJson(
        @RequestBody(content = @Content(encoding = @Encoding(name = "jsonRequest", contentType = MediaType.APPLICATION_JSON_VALUE)))
        @Parameter(description = "An extra JSON payload sent with file") @RequestPart("jsonRequest") final JsonRequest jsonRequest,
        @RequestPart("file") final MultipartFile file) {
    return null;
}

13.54. 我可以在 @Operation 注解内部使用 @Parameter 吗?

  • 是的,支持

13.55. 为什么我的参数被标记为必需?

  • 任何 @GetMapping 参数都被标记为必需,即使缺少 @RequestParam

  • 如果您需要不同的行为,可以添加 @Parameter(required=false) 注解。

  • 指定了 defaultValue 的查询参数被标记为必需。

13.56. 具有相同端点但参数不同的重载方法如何处理

  • springdoc-openapi 将这些方法呈现为单个端点。它检测重载的端点,并生成 parameters.schema.oneOf。

13.57. 设置 Swagger UI 以使用提供的 spec.yml 的正确方法是什么?

  • 使用此属性,所有 springdoc-openapi 自动配置 bean 都将被禁用

springdoc.api-docs.enabled=false
  • 然后通过添加此 Bean 启用最小 Bean 配置

@Bean
SpringDocConfiguration springDocConfiguration(){
   return new SpringDocConfiguration();
}

@Bean
SpringDocConfigProperties springDocConfigProperties() {
   return new SpringDocConfigProperties();
}

@Bean
ObjectMapperProvider objectMapperProvider(SpringDocConfigProperties springDocConfigProperties){
    return new ObjectMapperProvider(springDocConfigProperties);
}
  • 然后配置自定义 UI yaml 文件的路径。

springdoc.swagger-ui.url=/api-docs.yaml

13.58. 是否可以通过 @Parameter 标签发送授权标头?

13.59. 我的 Rest Controller 使用 @Controller 注解被忽略了?

  • 如果您的 @Controller 没有注解 @ResponseBody,这是默认行为

  • 您可以将您的控制器更改为 @RestControllers。或者添加 @ResponseBody + @Controller

  • 如果不可能,您可以配置 springdoc 以使用 SpringDocUtils 扫描您的其他控制器。例如

static {
   SpringDocUtils.getConfig().addRestControllers(HelloController.class);
}

13.60. 如何使用 application.yml 定义组?

  • 您可以使用 spring-boot 配置文件动态加载组。

  • 请注意,对于此用法,您不必声明 GroupedOpenApi Bean。

  • 您需要在前缀 springdoc.group-configs 下声明以下属性。

  • 例如

springdoc.group-configs[0].group=users
springdoc.group-configs[0].paths-to-match=/user/**
springdoc.group-configs[0].packages-to-scan=test.org.springdoc.api

13.61. 如何从参数对象中提取字段?

  • 您可以使用 springdoc 注解 @ParameterObject。

  • 使用 @ParameterObject 注解请求参数将有助于将参数的每个字段添加为单独的请求参数。

  • 这与 Spring MVC 请求参数映射到 POJO 对象兼容。

  • 此注解不支持嵌套参数对象。

  • POJO 对象必须包含带有强制前缀 get 的字段的 getter。否则,swagger 文档将不会显示带注解的实体的字段。

13.62. 如何使用最新的 springdoc-openapi SNAPSHOT?

  • 仅出于测试目的,您可以临时使用最新的 springdoc-openapi SNAPSHOT 进行测试

  • 为了实现这一点,您可以在您的 pom.xml 或您的 settings.xml 上添加以下部分

     <repositories>
       <repository>
         <id>snapshots-repo</id>
         <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
         <releases><enabled>false</enabled></releases>
         <snapshots><enabled>true</enabled></snapshots>
       </repository>
     </repositories>

13.63. 如何启用 springdoc-openapi MonetaryAmount 支持?

  • 如果应用程序想要启用 springdoc-openapi 支持,它会声明

SpringDocUtils.getConfig().replaceWithClass(MonetaryAmount.class, org.springdoc.core.converters.models.MonetaryAmount.class);
  • 另一种解决方案,不使用 springdoc-openapi MonetaryAmount,将是

SpringDocUtils.getConfig().replaceWithSchema(MonetaryAmount.class, new ObjectSchema()
            .addProperties("amount", new NumberSchema()).example(99.96)
            .addProperties("currency", new StringSchema().example("USD")));

13.64. 如何在一个应用程序中聚合外部端点(公开 OPENAPI 3 规范)?

属性 springdoc.swagger-ui.urls.* 适用于配置外部 (/v3/api-docs url)。例如,如果您想在一个应用程序中聚合其他服务的所有端点。重要提示:不要忘记也需要启用 CORS。

13.65. 如何使用自定义 json/yml 文件而不是生成的?

如果您的文件 open-api.json 包含 OpenAPI 3 格式的 OpenAPI 文档。然后只需声明:文件名可以是您想要的任何名称,只要您的声明是符合规范的 yaml 或 json OpenAPI Spec。

   springdoc.swagger-ui.url=/open-api.json

然后文件 open-api.json 应位于:src/main/resources/static 无需其他配置。

13.66. 如何启用 CSRF 支持?

如果您使用的是标准标头。(例如,使用 spring-security 标头)如果需要 CSRF Token,swagger-ui 会在每次 HTTP REQUEST 期间自动发送新的 XSRF-TOKEN。

如果您的 XSRF-TOKEN 不是基于标准的,您可以使用 requestInterceptor 通过 spring 资源转换器以编程方式手动捕获并将最新的 xsrf 令牌附加到请求

从 springdoc-openapi 的 v1.4.4 版本开始,添加了一个新属性以在使用标准标头名称时启用 CSRF 支持

springdoc.swagger-ui.csrf.enabled=true

13.67. 如何禁用默认的 swagger petstore URL?

您可以使用以下属性

springdoc.swagger-ui.disable-swagger-default-url=true

13.68. 是否支持 @PageableDefault 以增强 OpenAPI 3 文档?

是的,您可以将其与 @ParameterObject 注解结合使用。此外,spring-boot spring.data.web.spring.data.rest.default. 属性自 v1.4.5 起受支持

13.69. 如何使 spring security login-endpoint 可见?

您可以使用以下属性

springdoc.show-login-endpoint=true

13.70. 如何显示 schema 定义,即使 schema 未被引用?

您可以使用以下属性

springdoc.remove-broken-reference-definitions=false

13.71. 如何覆盖 @Deprecated?

springdoc-openapi 的全部理念是使您的文档尽可能接近代码,并尽量减少代码更改。如果代码包含 @Deprecatedsprindoc-openapi 也会将其 schema 视为已弃用。如果您想在 swagger 上将字段声明为未弃用,即使 java 代码中的字段包含 @Depreacted,您可以使用自 v1.4.3 版本以来可用的以下属性

springdoc.model-converters.deprecating-converter.enabled=false

13.72. 如何显示返回 ModelAndView 的方法?

您可以使用以下属性

springdoc.model-and-view-allowed=true

13.73. 如何获得 OpenApi 规范的格式化输出?

您可以使用以下属性

springdoc.writer-with-default-pretty-printer=true

13.74. 如何为同一个类定义不同的 schema?

复杂对象始终解析为对组件中定义的 schema 的引用。例如,让我们考虑一个带有 workAddresshomeAddress 属性(类型为 Address)的 Instance

public class PersonDTO {

    @JsonProperty
    private String email;

    @JsonProperty
    private String firstName;

    @JsonProperty
    private String lastName;

    @Schema(ref = "WorkAddressSchema")
    @JsonProperty
    private Address workAddress;

    @Schema(ref = "HomeAddressSchema")
    @JsonProperty
    private Address homeAddress;

}

public class Address {

    @JsonProperty
    private String addressName;

}

如果您想为此类定义两个不同的 schema,您可以设置 2 个不同的 schema,如下所示

@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI().components(new Components()
.addSchemas("WorkAddressSchema", getSchemaWithDifferentDescription(Address.class, "work Address" ))
.addSchemas("HomeAddressSchema", getSchemaWithDifferentDescription(Address.class, "home Address" )));
}

private Schema getSchemaWithDifferentDescription(Class className, String description){
ResolvedSchema resolvedSchema = ModelConverters.getInstance()
.resolveAsResolvedSchema(
new AnnotatedType(className).resolveAsRef(false));
return resolvedSchema.schema.description(description);
}

13.75. 如何根据用法为类属性定义不同的描述?

例如,让我们考虑一个带有 email 属性的 Instance

public class PersonDTO {

    @JsonProperty
    private String email;

    @JsonProperty
    private String firstName;

    @JsonProperty
    private String lastName;


}

如果您想为 email 定义两个不同的描述,您可以设置 2 个不同的 schema,如下所示

@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI().components(new Components()
.addSchemas("PersonDTO1", getFieldSchemaWithDifferentDescription(PersonDTO.class, "work email" ))
.addSchemas("PersonDTO2", getFieldSchemaWithDifferentDescription(PersonDTO.class, "home email" )));
}

private Schema getFieldSchemaWithDifferentDescription(Class className, String description){
    ResolvedSchema resolvedSchema = ModelConverters.getInstance()
            .resolveAsResolvedSchema(
                    new AnnotatedType(className).resolveAsRef(false));
    return resolvedSchema.schema.addProperties("email", new StringSchema().description(description));
}

13.76. 自定义 swagger 静态资源

您可以自定义位于 META-INF/resources/webjars/swagger-ui/{swagger.version}/ 中的 swagger 文档静态资源。资源列表包括

  • index.html

  • swagger-ui-bundle.js

  • swagger-ui.css

  • swagger-ui-standalone-preset.js

  • swagger-ui.css.map

  • swagger-ui-bundle.js.map

  • swagger-ui-standalone-preset.js.map

  • favicon-32x32.png

为此,您需要扩展 SwaggerIndexPageTransformer 的实现

public class SwaggerCodeBlockTransformer
       extends SwaggerIndexPageTransformer {
  // < constructor >
  @Override
  public Resource transform(HttpServletRequest request,
                            Resource resource,
                            ResourceTransformerChain transformer)
                            throws IOException {
      if (resource.toString().contains("swagger-ui.css")) {
          final InputStream is = resource.getInputStream();
          final InputStreamReader isr = new InputStreamReader(is);
          try (BufferedReader br = new BufferedReader(isr)) {
              final String css = br.lines().collect(Collectors.joining());
              final byte[] transformedContent = css.replace("old", "new").getBytes();
              return  new TransformedResource(resource, transformedContent);
          } // AutoCloseable br > isr > is
      }
      return super.transform(request, resource, transformer);
  }

}

接下来,将转换器 @Bean 添加到您的 @Configuration

@Configuration
public class OpenApiConfig {
    @Bean
    public SwaggerIndexTransformer swaggerIndexTransformer(
            SwaggerUiConfigProperties a,
            SwaggerUiOAuthProperties b,
            SwaggerUiConfigParameters c,
            SwaggerWelcomeCommon d) {
        return new SwaggerCodeBlockTransformer(a, b, c, d);
    }
}

示例说明

Illustrative example

13.77. 是否支持 GraalVM?

spring-boot 3 中添加了本机支持。如果您有时间,请在下一个版本之前毫不犹豫地进行测试。

对于 OpenAPI REST 端点,您只需使用 spring native profile 构建您的应用程序。

如果您将 @OpenAPIDefinition@SecurityScheme 赋予没有实现的类,则当您以本机方式编译时,该类将消失。为避免这种情况,请为该类提供 @Configuration

@Configuration
@OpenAPIDefinition(info = @Info(title = "My App", description = "description"))
public class OpenAPIConfig {
}

13.78. 如何将 Open API 3 与 Spring 项目(非 Spring Boot)集成?

当您的应用程序使用 spring 而不使用 (spring-boot) 时,您需要添加 spring-boot 本机提供的 bean 和自动配置。

例如,假设您想在 spring-mvc 应用程序中加载 swagger-ui

  • 您主要需要添加 springdoc-openapi 模块

<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
   <version>last.version</version>
</dependency>
  • 如果您没有 spring-boot 和 spring-boot-autoconfigure 依赖项,则需要添加它们。并注意您的 spring.version 和 spring-boot.version 之间的兼容性矩阵。例如,在这种情况下 (spring.version=5.1.12.RELEASE)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>3.3.3</version>
        </dependency>
  • 扫描 springdoc-openapi 的 '自动配置类,spring-boot 会自动为您加载这些类。

  • 根据您的模块,您可以在每个 springdoc-openapi 模块的 spring.factories 文件中找到它们。

@Configuration
@EnableWebMvc
public class WebConfig implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext)  {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("RestServlet",
                new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/*");
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(this.getClass(),
                SpringDocConfiguration.class,
                SpringDocConfigProperties.class,
                SpringDocSpecPropertiesConfiguration.class,
                SpringDocWebMvcConfiguration.class,
                MultipleOpenApiSupportConfiguration.class,
                SwaggerConfig.class,
                SwaggerUiConfigProperties.class,
                SwaggerUiOAuthProperties.class,
        );
        return context;
    }
}
  • 根据您的模块,您可以在每个 springdoc-openapi 模块的 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中找到它们。

  • 对于组用法,请确保扫描您的 GroupedOpenApi Bean。

  • 如果此外,您正在使用自定义 context path: /my-servlet-path。请确保您声明了以下属性

spring.mvc.servlet.path=/my-servlet-path

13.79. springdoc-openapispring-boot 的兼容性矩阵是什么?

springdoc-openapi 2.xspring-boot 3 兼容。

一般来说,您应该仅选择今天最新的稳定版本 2.8.5。

更准确地说,这是构建 springdoc-openapi 的 spring-boot 版本的详尽列表

Spring Boot 版本

Springdoc OpenAPI 版本

3.4.x

2.7.x - 2.8.x

3.3.x

2.6.x

3.2.x

2.3.x - 2.5.x

3.1.x

2.2.x

3.0.x

2.0.x - 2.1.x

2.7.x, 1.5.x

1.6.0+

2.6.x, 1.5.x

1.6.0+

2.5.x, 1.5.x

1.5.9+

2.4.x, 1.5.x

1.5.0+

2.3.x, 1.5.x

1.4.0+

2.2.x, 1.5.x

1.2.1+

2.0.x, 1.5.x

1.0.0+

13.80. 为什么我在覆盖默认的 spring 注册的 HttpMessageConverter 时收到错误:Swagger UI unable to render definition

当覆盖默认的 spring-boot 注册的 HttpMessageConverter 时,您应该同时注册 ByteArrayHttpMessageConverter 以获得正确的 springdoc-openapi 支持。

    converters.add(new ByteArrayHttpMessageConverter());
    converters.add(new MappingJackson2HttpMessageConverter(jacksonBuilder.build()));
注册 HttpMessageConverters 时,顺序非常重要。

13.81. 某些参数未在生成的 OpenAPI 规范中生成。

此问题是由 Spring-Boot 3.2.0 引入的更改引起的,特别是对于参数名称发现。可以通过将 -parameters 参数添加到 Maven Compiler Plugin 来解决此问题。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <parameters>true</parameters>
    </configuration>
</plugin>