springdoc-openapi v1.8.0 是支持 Spring Boot 2.x 和 1.x 的最新开源版本。现在为需要 2023 年以后支持的组织提供对 springdoc-openapi v1 项目的扩展支持。 有关更多详细信息,请随时联系:sales@springdoc.org |
springdoc-openapi
在 Open 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 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.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
类型,例如:@RepositoryRestResource
和 QuerydslPredicate
注解。
使用 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-security
或 spring-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-ui 和 openapi 端点。
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
例如,如果您有以下设置
将提供两个端点
-
包含 OpenAPI 定义的 REST API
-
http://serverName:managementPort/actuator/openapi
-
-
一个路由到 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 访问应用程序端点,并使用与应用程序不同的端口,则应在应用程序级别启用 endpoints 的 CORS 。 |
此外,还可以将此属性与现有属性结合使用,以在 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.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)
5. Springdoc-openapi 属性
springdoc-openapi
依赖于标准 spring 配置属性 (yml 或 properties),使用标准文件位置。
5.1. springdoc-openapi 核心属性
参数名称 | 默认值 | 描述 |
---|---|---|
springdoc.api-docs.path |
|
|
springdoc.api-docs.enabled |
|
|
springdoc.packages-to-scan |
|
|
springdoc.paths-to-match |
|
|
springdoc.produces-to-match |
|
|
springdoc.headers-to-match |
|
|
springdoc.consumes-to-match |
|
|
springdoc.paths-to-exclude |
|
|
springdoc.packages-to-exclude |
|
|
springdoc.default-consumes-media-type |
|
|
springdoc.default-produces-media-type |
|
|
springdoc.cache.disabled |
|
|
springdoc.show-actuator |
|
|
springdoc.auto-tag-classes |
|
|
springdoc.model-and-view-allowed |
|
|
springdoc.override-with-generic-response |
|
|
springdoc.group-configs[0].group |
|
|
springdoc.group-configs[0].display-name |
|
|
springdoc.group-configs[0].packages-to-scan |
|
|
springdoc.group-configs[0].paths-to-match |
|
|
springdoc.group-configs[0].paths-to-exclude |
`` |
|
springdoc.group-configs[0].packages-to-exclude |
|
|
springdoc.group-configs[0].produces-to-match |
|
|
springdoc.group-configs[0].consumes-to-match |
|
|
springdoc.group-configs[0].headers-to-match |
|
|
springdoc.webjars.prefix |
|
|
springdoc.api-docs.resolve-schema-properties |
|
|
springdoc.remove-broken-reference-definitions |
|
|
springdoc.writer-with-default-pretty-printer |
|
|
springdoc.model-converters.deprecating-converter.enabled |
|
|
springdoc.model-converters.polymorphic-converter.enabled |
|
|
springdoc.model-converters.pageable-converter.enabled |
|
|
springdoc.model-converters.sort-converter.enabled |
|
|
springdoc.use-fqn |
|
|
springdoc.show-login-endpoint |
|
|
springdoc.pre-loading-locales |
|
|
springdoc.writer-with-order-by-keys |
|
|
springdoc.use-management-port |
|
|
springdoc.disable-i18n |
|
|
springdoc.show-spring-cloud-functions |
|
|
springdoc.enable-groovy |
|
|
springdoc.enable-spring-security |
|
|
springdoc.enable-kotlin |
|
|
springdoc.enable-hateoas |
|
|
springdoc.enable-data-rest |
|
|
springdoc.api-docs.version |
|
|
springdoc.default-flat-param-object |
|
|
springdoc.default-support-form-data |
|
|
springdoc.nullable-request-parameter-enabled |
|
|
springdoc.show-oauth2-endpoints |
|
|
springdoc.api-docs.resolve-extensions-properties |
|
|
springdoc.enable-default-api-docs |
|
|
springdoc.trim-kotlin-indent |
|
|
springdoc.allowed-locales |
|
5.2. swagger-ui 属性
-
springdoc-openapi
上提供了 swagger-ui 属性的支持。请参阅 官方文档。 -
您可以在文档中使用与 Spring Boot 属性相同的 swagger-ui 属性。
所有这些属性都应使用以下前缀声明:springdoc.swagger-ui |
参数名称 | 默认值 | 描述 |
---|---|---|
springdoc.swagger-ui.path |
|
|
springdoc.swagger-ui.enabled |
|
|
springdoc.swagger-ui.configUrl |
|
|
springdoc.swagger-ui.layout |
|
|
springdoc.swagger-ui.validatorUrl |
默认情况下,Swagger UI 不会验证规范。您可以使用此参数设置验证器 URL,例如针对 swagger.io 的在线验证器。 |
|
springdoc.swagger-ui.tryItOutEnabled |
|
|
springdoc.swagger-ui.filter |
|
|
springdoc.swagger-ui.operationsSorter |
|
|
springdoc.swagger-ui.tagsSorter |
|
|
springdoc.swagger-ui.oauth2RedirectUrl |
|
|
springdoc.swagger-ui.displayOperationId |
|
|
springdoc.swagger-ui.displayRequestDuration |
|
|
springdoc.swagger-ui.deepLinking |
|
|
springdoc.swagger-ui.defaultModelsExpandDepth |
|
|
springdoc.swagger-ui.defaultModelExpandDepth |
|
|
springdoc.swagger-ui.defaultModelRendering |
|
|
springdoc.swagger-ui.docExpansion |
|
|
springdoc.swagger-ui.maxDisplayedTags |
|
|
springdoc.swagger-ui.showExtensions |
|
|
springdoc.swagger-ui.url |
|
|
springdoc.swagger-ui.showCommonExtensions |
|
|
springdoc.swagger-ui.supportedSubmitMethods |
|
|
springdoc.swagger-ui.queryConfigEnabled |
|
|
springdoc.swagger-ui.oauth. additionalQueryStringParams |
|
|
springdoc.swagger-ui.disable-swagger-default-url |
|
|
springdoc.swagger-ui.urls[0].url |
|
|
springdoc.swagger-ui.urls[0].name |
|
|
springdoc.swagger-ui.urlsPrimaryName |
|
|
springdoc.swagger-ui.oauth.clientId |
|
|
springdoc.swagger-ui.oauth.clientSecret |
|
|
springdoc.swagger-ui.oauth.realm |
|
|
springdoc.swagger-ui.oauth.appName |
|
|
springdoc.swagger-ui.oauth.scopeSeparator |
|
|
springdoc.swagger-ui.csrf.enabled |
|
|
springdoc.swagger-ui.csrf.use-local-storage |
|
|
springdoc.swagger-ui.csrf.use-session-storage |
|
|
springdoc.swagger-ui.csrf.cookie-name |
|
|
springdoc.swagger-ui.csrf.header-name |
|
|
springdoc.swagger-ui.syntaxHighlight.activated |
|
|
springdoc.swagger-ui.syntaxHighlight.theme |
|
|
springdoc.swagger-ui.oauth. useBasicAuthentication WithAccessCodeGrant |
|
|
springdoc.swagger-ui.oauth. usePkceWithAuthorization CodeGrant |
|
|
springdoc.swagger-ui.persistAuthorization |
|
|
springdoc.swagger-ui.use-root-path |
|
|
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 | 描述 |
---|---|---|
|
|
包括基础 |
|
|
用于 Spring Data Rest 支持 |
|
|
用于 Groovy 支持 |
|
|
用于 Spring Hateoas 支持 |
|
|
用于 Javadoc 支持 |
|
|
用于 Kotlin 支持 |
|
|
用于 Spring Security 支持 |
|
|
用于 Spring WebMvc 支持 |
|
|
用于 Spring WebFlux 支持 |
|
|
用于在 Spring WebMvc 上下文中使用 Swagger-UI |
|
|
用于在 Spring WebFlux 上下文中使用 Swagger-UI |
类/注解更改 |
springdoc-openapi-v1 | springdoc-openapi-v2 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
迁移提示 |
以下模块不再需要,可以删除
-
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"));
}
-
如果 swagger-ui 通过代理提供服务
-
自定义 Swagger UI
-
从文档中隐藏操作或控制器
11. 赞助
springdoc-openapi
在 Open 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 将丢失。
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.5. 如何在 Swagger UI 中控制操作和标签的默认展开设置?
-
您可以在 application.yml 中设置此属性,例如
springdoc.swagger-ui.doc-expansion= none
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.10. 如何将 enumAsRef = true
应用于所有枚举?
-
声明以下属性
static { io.swagger.v3.core.jackson.ModelResolver.enumsAsRef = true; }
13.13. 如何以编程方式设置 Swagger 属性?
可以通过创建如下所示的 swaggerUiConfig
bean 来设置这些属性
@Bean
@Primary
fun swaggerUiConfig(config: SwaggerUiConfigProperties): SwaggerUiConfigProperties {
config.showCommonExtensions = true
config.queryConfigEnabled = true
return config
}
13.15. 如何忽略来自 spring-security 的 @AuthenticationPrincipal
参数?
-
一个解决方案是使用:
@Parameter(hidden = true)
-
使用
spring-boot-starter-security
或spring-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.19. springdoc-openapi
是否支持 Jersey?
-
如果您正在使用 JAX-RS 并且以 Jersey 作为实现(例如
@Path
),我们不支持它。 -
我们仅支持使用 Spring 管理的 bean(例如
@RestController
)公开 Rest 端点。 -
您可以查看 swagger-jaxrs2 项目
13.20. springdoc-openapi
是否可以仅为 @RestController
生成 API?
-
@RestController
相当于类型级别的@Controller
+@RequestMapping
。 -
对于某些旧版应用程序,我们仍然需要支持两者。
-
如果您需要隐藏类型级别的
@Controller
,在这种情况下,您可以在控制器级别使用:@Hidden
。 -
请注意,此注解也可用于从生成的文档中隐藏某些方法。
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-Host
、X-Forwarded-Port
、X-Forwarded-Proto
、X-Forwarded-Ssl
和X-Forwarded-Prefix
。 -
如果代理添加了常用的
X-Forwarded-For
和X-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.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 对象?
-
您可以编写自己的
OpenApiCustomizer
实现。 -
示例可在
@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)?
-
您可以使用
springdoc-openapi-maven-plugin
实现此功能 -
您可以自定义输出目录 (属性 outputDir):默认值是:${project.build.directory}
13.32. 文档中忽略的类型有哪些?
-
Principal
、Locale
、HttpServletRequest
和HttpServletResponse
以及 Spring MVC 支持的其他可注入参数均被排除在外。 -
完整文档请参阅此处
13.33. 如何禁用忽略的类型
如果您不想忽略类型 Principal
、Locale
、HttpServletRequest
和其他类型,
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-annotations
和swagger-ui
官方库。 -
我们支持 Spring 5 上的新功能,例如带有注解和函数式风格的
spring-webflux
。 -
我们尽最大努力回答所有问题并解决所有问题或增强请求
13.36. 如何使用 springdoc-openapi 迁移到 OpenAPI 3
-
springdoc-openapi
和springfox
之间没有关系。如果您想迁移到 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.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.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.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.53. 是否支持文件上传?
-
该库支持主要文件类型:
MultipartFile
、@RequestPart
、FilePart
-
您可以按如下方式上传文件
@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.55. 为什么我的参数被标记为必需?
-
任何
@GetMapping
参数都被标记为必需,即使缺少@RequestParam
。 -
如果您需要不同的行为,可以添加
@Parameter(required=false)
注解。 -
指定了
defaultValue
的查询参数被标记为必需。
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 标签发送授权标头?
-
OpenAPI 3 规范不允许显式添加 Authorization 标头。
注意:不允许使用名为 Accept、Content-Type 和 Authorization 的标头参数。要描述这些标头
-
有关更多信息,您可以阅读
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.71. 如何覆盖 @Deprecated?
springdoc-openapi
的全部理念是使您的文档尽可能接近代码,并尽量减少代码更改。如果代码包含 @Deprecated
,sprindoc-openapi
也会将其 schema 视为已弃用。如果您想在 swagger 上将字段声明为未弃用,即使 java 代码中的字段包含 @Depreacted
,您可以使用自 v1.4.3 版本以来可用的以下属性
springdoc.model-converters.deprecating-converter.enabled=false
13.74. 如何为同一个类定义不同的 schema?
复杂对象始终解析为对组件中定义的 schema 的引用。例如,让我们考虑一个带有 workAddress
和 homeAddress
属性(类型为 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);
}
}
示例说明

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-openapi
与 spring-boot
的兼容性矩阵是什么?
springdoc-openapi 2.x
与 spring-boot 3
兼容。
一般来说,您应该仅选择今天最新的稳定版本 2.8.5。
更准确地说,这是构建 springdoc-openapi
的 spring-boot 版本的详尽列表
Spring Boot 版本 |
Springdoc OpenAPI 版本 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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>