SpringDoc是用于生成SpringBoot项目API文档的Java库。在代码中使用swagger-api
注解,即可生成相应的API文档,和JavaDoc非常类似。
SpringDoc基于Swagger 3
,Swagger 3
包名为io.swagger.core.v3
。
Swagger 3
实现了OpenAPI 3
接口规范,类似Hibernate
实现JPA
规范。Swagger 3
提供了API注解,还提供了Swagger-ui
用于生成API文档界面,以及其它的基础功能。
SpringDoc的作用主要是将Swagger 3
和SpringBoot
结合起来。
只需要在pom.xml
中引入SpringDoc即可。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.11</version>
</dependency>
启动程序后,访问/swagger-ui/index.html
,就会显示API文档页面。
也可访问/v3/api-docs
,返回的是API文档的JSON
结构数据。可以用该数据生成其它风格的API文档页面,比如可以提供给Apifox
生成API文档。
文档生成的原理是通过扫描源代码中的Controller
,根据RequestMapping
和相应方法的参数生成文档。
上面生成的文档并没有良好的注释,我们可以通过swagger-api
注解,给接口加上注释。注解的包路径为io.swagger.v3.oas.annotations
@Tag(name = "ArticleController", description = "文章接口")
@RestController
public class ArticleController {
@Operation(summary = "根据文章ID获取文章对象")
@ApiResponses(value = {@ApiResponse(description = "文章对象")})
@GetMapping("/article/{id}")
public Article getArticleById(@Parameter(description = "文章ID", required = true) @PathVariable("id") Integer id) {
...
}
}
@Tag(name = "ArticleController", description = "文章接口")
@Operation(summary = "根据文章ID获取文章对象")
@Parameter(description = "文章ID", required = true)
@ApiResponses(value = {@ApiResponse(description = "文章对象")})
接口文档基于OpenAPI
规范,了解OpenAPI
规范有助于了解完整接口文档的编写方式。
参考资料:OpenAPI基本结构
上面的注解对应的OpenAPI
规范大致如下:
paths:
/article/{id}:
get:
summary: 根据文章ID获取文章对象
parameters:
- name: id
in: path
required: true
description: 文章ID
schema:
type : integer
format: int32
responses:
default:
description: 文章对象
除了对API进行注解,还可对实体类进行注解。同时支持JSR-303注解。
@Schema(description = "文章")
@NotNull(message = "不能为空")
public class Article extends Serializable {
@Schema(description = "标题")
private String title;
}
定义文档标题、文档版本号等信息。
@OpenAPIDefinition(
info = @Info(
title = "UJCMS API",
description = "UJCMS 接口文档",
version = "1.0.0"
)
)
@Configuration
public class SwaggerConfig {
}
也可使用Java代码
@Bean
public OpenAPI openApi() {
return new OpenAPI().info(new Info().title("UJCMS API").description("UJCMS 接口文档").version("1.0.0"));
}
对应的OpenAPI规范:
info:
title: UJCMS API
description: UJCMS 接口文档
version: 1.0.0
如果接口较多,可以对接口进行分组,方便查看。
@Configuration
public class SwaggerConfig {
/**
* 前台 API 分组
*/
@Bean
public GroupedOpenApi frontendGroup(@Value() {
return GroupedOpenApi.builder().group("frontend").displayName("前台API")
.addOpenApiCustomiser(openApi -> openApi.info(new Info().title("UJCMS 前台 API").version("1.0.0")))
.packagesToScan("com.ujcms.cms.core.web.api")
.pathsToMatch("/api/**")
.build();
}
/**
* 后台 API 分组
*/
@Bean
public GroupedOpenApi backendGroup() {
return GroupedOpenApi.builder().group("backend").displayName("后台API")
.addOpenApiCustomiser(openApi -> openApi.info(new Info().title("UJCMS 后台 API").version("1.0.0")))
.packagesToScan("com.ujcms.cms.core.web.backendapi")
.pathsToMatch("/api/backend/**")
.build();
}
}
也可在配置文件中设置分组:
springdoc.group-configs:
- group: frontend
displayName: 前台API
packagesToScan: com.ujcms.cms.core.web.api
pathsToMatch: /api/**
- group: backend
displayName: 后台API
packagesToScan: com.ujcms.cms.core.web.backendapi
pathsToMatch: /api/backend/**
Swagger不仅能够查看文档,还能在线执行API,不仅能说还能练。
很多情况下API需要登录才能执行,这就需要权限认证。
以前面的后台API为例,增加权限认证的方式如下:
private static final String BEARER_AUTH = "bearerAuth";
@Bean
public GroupedOpenApi backendGroup() {
return GroupedOpenApi.builder().group("backend").displayName("后台API")
.addOpenApiCustomiser(openApi -> openApi.info(new Info().title("UJCMS 后台 API").version("1.0.0")))
.packagesToScan("com.ujcms.cms.core.web.backendapi")
.pathsToMatch("/api/backend/**")
.addOpenApiCustomiser(openApi -> openApi.components(new Components()
.addSecuritySchemes(BEARER_AUTH, new SecurityScheme()
.type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT"))))
.addOperationCustomizer((operation, handlerMethod) -> {
operation.addSecurityItem(new SecurityRequirement().addList(BEARER_AUTH));
return operation;
})
.build();
}
此时API接口文档处会出现Authorize
按钮。
填入Bearer
内容,即可完成登录。
参考资料:https://swagger.io/docs/specification/authentication/
常用配置项:
springdoc.api-docs.enabled
:api-docs是否开启。默认开启。springdoc.swagger-ui.enabled
: swagger-ui是否开启。默认开启。springdoc.packages-to-scan
: API文档的包扫描路径。默认扫描所有包。springdoc.paths-to-match
: API文档的包含的请求路径。默认包含所有请求路径。完整的配置文档:https://springdoc.org/#properties