
离线 TA的专栏
- 打卡等级:偶尔看看
- 打卡总天数:14
- 打卡月天数:0
- 打卡总奖励:221
- 最近打卡:2023-08-27 09:07:40
|
SpringDoc 是基于 Spring Boot 的现代化 API 文档生成工具,通过自动化扫描代码和注解,生成符合 OpenAPI 3.0+ 规范 的交互式文档,并集成 Swagger UI 提供可视化测试界面。以下是其核心详解:
核心特性与优势
开箱即用
仅需添加依赖,无需复杂配置即可自动生成文档,支持 Spring WebMvc、WebFlux、Spring Security 及 Jakarta EE。 注解驱动
使用 JSR-303 规范注解(如 、)替代 SpringFox 专属注解,降低学习成本。动态兼容性
完美适配 Spring Boot 2.6+ 及 3.x(含 JDK 17+),解决 SpringFox 因停维护导致的不兼容问题。 多格式输出
支持 JSON/YAML/HTML 格式文档,并提供分组功能,可按模块划分接口(如公开 API 与内部 API)。
集成与配置
依赖引入(Spring Boot 3.x)
- <dependency>
- <groupId>org.springdoc</groupId>
- <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
- <version>2.5.0</version> <!-- 官方稳定版,兼容 Spring Boot 3.3.x:cite[2]:cite[8] -->
- </dependency>
复制代码
基础配置(application.yml)
- springdoc:
- swagger-ui:
- # 开启 swagger-ui 文档展示
- enabled: true
- # UI访问路径
- path: /swagger-ui.html
- # 标签排序方式
- tags-sorter: alpha
- # 操作排序方式
- operations-sorter: alpha
- # 保持认证状态
- persistAuthorization: true
- # 禁用示例接口
- disable-swagger-default-url: true
- api-docs:
- # 开启 OpenAPI 展示
- enabled: true
- # OpenAPI JSON路径
- path: /v3/api-docs
- default-consumes-media-type: application/json
- default-produces-media-type: application/json
- cache:
- # 关闭文档缓存
- disabled: false
- # 显示actuator端点
- show-actuator: false
- # 推荐保持默认,显示结构化参数
- # default-flat-param-object: true
- # 允许在文档中展示 Spring MVC 的 ModelAndView 返回类型
- model-and-view-allowed: true
- # 推荐关闭以确保文档精确性
- override-with-generic-response: false
复制代码
全局信息配置类(可选)
- @Configuration
- @OpenAPIDefinition(
- info = @Info(title = "项目API文档", version = "1.0", description = "SpringBoot接口文档")
- )
- public class SpringDocConfig {
- // 无需额外代码
- }
复制代码
注解使用
常用注解
| 场景 | SpringDoc 注解 | 示例 |
|---|
| 控制器描述 | @Tag(name="模块", description="") | @Tag(name="用户管理", description="用户CRUD") | | 接口方法描述 | @Operation(summary="", description="") | @Operation(summary="创建用户", description="需管理员权限") | | 参数描述 | @Parameter(description="") | @Parameter(description="用户ID", required=true) | | 模型属性描述 | @Schema(description="") | public class User { @Schema(description="用户名") private String name; }l | | 解析对象属性为查询参数 | @ParameterObject | public BizResponse getUserPage(@ParameterObject UserPageForm form) {} |
提示:
- @Hidden 可隐藏接口或参数;
- 支持 Spring Security 的 @PreAuthorize 注解,自动在文档中标记权限需求。
控制层注解使用示例
- @RestController
- @RequestMapping("/api/users")
- @Tag(name = "用户管理", description = "用户相关操作API")
- public class UserController{
-
- @Operation(summary = "获取用户信息", description = "通过用户id获取用户信息")
- @Parameters({
- @Parameter(in = ParameterIn.PATH, name = "id", description = "用户uid", required = true)
- })
- @ApiResponse(responseCode = "404", description = "User not found")
- @GetMapping("/{id}")
- public ResponseEntity<User> getUserById(@PathVariable Long id){
- // 实现代码
- return new ResponseEntity(new User(10001,"feng","ADMIN"), HttpStatusCode.valueOf(200));
- }
-
- @Operation(summary = "获取用户列表-分页")
- @GetMapping("/userPage.do")
- public BizResponse getUserPage(@ParameterObject UserPageForm form) {
- return BizResponse.ok(userServer.getUserPage(form));
- }
-
- @Operation(summary = "文件上传")
- @PostMapping(name = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
- public BizResponse<FileInfoVo> fileUpload(
- @Parameter(description = "文件",
- content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
- schema = @Schema(type = "string", format = "binary")))
- @RequestParam MultipartFile file) {
- FileInfo fileInfo = fileStorageService.of(file).setPath(uploadFilePath).upload();
- return BizResponse.ok(fileInfo);
- }
- }
复制代码
模型注解使用示例
- import io.swagger.v3.oas.annotations.media.Schema;
- import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
- import jakarta.validation.constraints.Email;
- import jakarta.validation.constraints.Size;
-
- @data
- public clas sUser{
-
- @Schema(description = "用户ID", example = "1001")
- private Integer id;
-
- @Schema(description = "用户名", example = "john_doe", requiredMode = RequiredMode.REQUIRED)
- @Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
- private String username;
-
- @Schema(description = "用户角色", allowableValues = {"ADMIN", "USER", "GUEST"})
- private String role;
-
- @Schema(description = "邮箱", example = "john_doe@mail.com")
- @Email
- private String email;
-
- @Schema(description = "最近登录时间", example = "2025-07-15 12:25:32", type = "string")
- private Date lastLoginTime;
-
- @Schema(description = "出生年月日", example = "2025-07-15", type = "string")
- @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
- private Date birthDate;
- }
复制代码
文件上传注解使用示例
文件上传必须声明以下配置,否则 SpringDoc 无法识别为文件类型,文件参数不会显示为文件上传控件
- 必须配置
- consumes = MediaType.MULTIPART_FORM_DATA_VALUE
复制代码 - 参数必须明确声明
单文件上传
- @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
- @Operation(summary = "上传文件")
- public ResponseEntity<String> uploadFile(
- @Parameter(
- description = "文件参数",
- required = true,
- content = @Content( // 关键:嵌套Content注解
- mediaType = MediaType.APPLICATION_OCTET_STREAM_VALUE,
- schema = @Schema(type = "string", format = "binary") // 明确格式
- )
- )
- @RequestParam("file") MultipartFile file) {
- // 业务逻辑
- }
复制代码
多文件上传(数组形式)
- @Parameter(
- description = "多文件上传",
- content = @Content(
- mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
- array = @ArraySchema( // 声明数组类型
- schema = @Schema(type = "string", format = "binary")
- )
- )
- )
- @RequestParam("files") MultipartFile[] files
复制代码
混合参数(文件+表单数据)
- @RequestBody(
- description = "混合参数请求",
- content = @Content(
- mediaType = MediaType.MULTIPART_FORM_DATA_VALUE,
- encoding = {
- @Encoding(name = "file", contentType = "image/jpeg"), // 指定文件类型
- @Encoding(name = "remark", contentType = "text/plain") // 文本参数
- }
- )
- )
- @RequestPart("file") MultipartFile file,
- @RequestPart("remark") String remark
复制代码
分组与扩展功能
分组配置
按模块隔离接口
- @Bean
- public GroupedOpenApi publicApi() {
- return GroupedOpenApi.builder()
- .group("公开接口")
- .pathsToMatch("/api/public/**")
- .build();
- }
-
- @Bean
- public GroupedOpenApi adminApi() {
- return GroupedOpenApi.builder()
- .group("管理接口")
- .pathsToMatch("/api/admin/**")
- .addOpenApiMethodFilter(method -> method.isAnnotationPresent(PreAuthorize.class))
- .build();
- }
复制代码
访问 Swagger UI 右上角切换分组
生产环境安全建议
通过配置动态关闭文档
- springdoc:
- swagger-ui:
- enabled: false # 生产环境禁用 UI
- api-docs:
- enabled: false # 禁用 OpenAPI 端点:cite[1]
复制代码
从 SpringFox 迁移指南
| SpringFox 注解 | SpringDoc 替代方案 |
|---|
| @Api | @Tag | | @ApiOperation | @Operation(summary="", description="") | | @ApiModelProperty | @Schema(description="") | | @ApiParam | @Parameter | | @ApiIgnore | @Hidden |
迁移优势:
- 支持 Spring Boot 3.x 和 JDK 17+;
- 注解更简洁,符合 OpenAPI 3 规范
最佳实践与常见问题
依赖冲突
排除旧版 Swagger 依赖(如 ),避免与 SpringDoc 冲突1。拦截器导致文档无法访问
若项目使用 Spring Security,需放行文档路径:
- http.authorizeRequests().antMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll();
复制代码文档生成失败排查
检查控制器是否被扫描:确保 位于- springdoc.packages-to-scan
复制代码 指定路径下
总结
SpringDoc 凭借 零配置启动、注解简洁 和 深度兼容 Spring 生态 的优势,已成为 Spring Boot API 文档的首选工具。其核心价值在于:
- 自动化 - 减少手动维护文档的成本;
- 标准化 - 严格遵循 OpenAPI 3 规范;
- 可扩展 - 分组、安全控制灵活适配复杂项目。
- 访问
- http://localhost:8080/swagger-ui.html
复制代码 即可查看交互式文档(默认路径)
到此这篇关于SpringDoc基本使用的方法示例的文章就介绍到这了,更多相关SpringDoc使用内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯! 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:  进行删除处理。
4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
|