SpringDoc基础应用全方位解读

文章标题:

SpringDoc基础应用深度剖析

文章内容:

SpringDoc是一款基于Spring Boot的现代化API文档生成工具,它能够通过自动扫描代码以及相关注解,生成符合OpenAPI 3.0+规范的交互式文档,并且还集成了Swagger UI来提供可视化的测试界面。下面是对它的核心内容进行详细解读:

核心特性与长处

  • 即装即用
    只需添加相应依赖,无需进行复杂的配置就能自动生成文档,支持Spring WebMvc、WebFlux、Spring Security以及Jakarta EE等。
  • 注解驱动
    运用JSR - 303规范的注解(像@Tag@Operation)来替代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; }
解析对象属性为查询参数 @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 class User{

    @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无法识别为文件类型,文件参数不会显示为文件上传控件
    • @PostMapping必须配置consumes = MediaType.MULTIPART_FORM_DATA_VALUE
    • MultipartFile参数必须明确声明format = "binary"
  • 单文件上传
@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规范

最佳实践与常见问题

  1. 依赖冲突
    排除旧版Swagger依赖(如springfox-swagger2),避免与SpringDoc冲突1。
  2. 拦截器导致文档无法访问
    若项目使用Spring Security,需放行文档路径:
http.authorizeRequests().antMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll();
  1. 文档生成失败排查
    检查控制器是否被扫描:确保@RestController位于springdoc.packages-to-scan指定路径下

总结

SpringDoc凭借零配置启动注解简洁以及深度兼容Spring生态的优势,已经成为Spring Boot API文档的首选工具。它的核心价值在于:
* 自动化——减少手动维护文档的成本;
* 标准化——严格遵循OpenAPI 3规范;
* 可扩展——分组、安全控制灵活适配复杂项目。
访问http://localhost:8080/swagger-ui.html即可查看交互式文档(默认路径)

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13176.html

(0)
LomuLomu
上一篇 2025 年 8 月 15 日
下一篇 2025 年 8 月 15 日

相关推荐

  • 2026年 PyCharm 激活破解合集,多方案任选

    PyCharm永久激活教程:2025最新破解补丁与激活码获取指南(支持全版本) 重要提示:本文整理的PyCharm破解补丁及激活码来源于网络,仅限个人学习研究使用,禁止任何商业用途。若涉及侵权问题,请联系作者删除。经济条件允许的话,强烈建议购买官方正版授权! PyCharm是JetBrains公司出品的一款功能强大的Python集成开发环境,支持Window…

    PyCharm激活码 2026 年 3 月 29 日
    9000
  • 2025.3idea激活码同步更新

    申明:本教程 IntelliJ IDEA 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! IDEA是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 不管你是什么版本、什么…

    IDEA破解教程 2026 年 1 月 20 日
    17900
  • 永久pycharm激活码配置教程与最新pycharm破解同步

    2024最新PyCharm破解教程:永久激活至2099年(附激活码+图文详解) 本方法通用于IDEA、PyCharm、DataGrip、Goland等JetBrains全家桶产品! 话不多说,先看效果图——最新版PyCharm破解成功的界面如下,许可证有效期至2099年,非常稳定! 接下来,我将通过完整的图文流程,详细演示如何将PyCharm激活到2099年…

    PyCharm激活码 2026 年 1 月 12 日
    49400
  • 多端互通最新版datagrip激活码,权威破解教程

    声明:本文所涉及的 DataGrip 破解补丁与激活码均源自网络公开渠道,仅供个人学习与研究之用,禁止任何商业用途。若条件允许,请支持正版,前往官方购买授权! DataGrip 是 JetBrains 出品的一款跨平台数据库 IDE,支持 Windows、macOS 与 Linux。下文将以 2025.2 版为例,手把手演示如何通过补丁实现永久解锁全部高级功…

    DataGrip激活码 2025 年 10 月 23 日
    26500
  • IDEA激活码怎么获取?最新破解方法一文讲透!

    重要提醒:以下破解补丁与激活码均来自互联网公开分享,仅供个人学习研究,禁止商业用途。如条件允许,请支持正版:https://panghu.hicxy.com/shop/?id=18 IntelliJ IDEA 是 JetBrains 打造的跨平台 IDE,Windows、macOS、Linux 全支持。本文手把手教你用破解补丁永久解锁 2025.2 及更早版…

    2025 年 9 月 30 日
    69200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信