SpringDoc基本使用的方法示例

 更新时间:2025年07月22日 09:18:31   作者:墨鸦_Cormorant  
SpringDoc是基于Spring Boot的现代化API文档生成工具,下面就来介绍一下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; }l
解析对象属性为查询参数@ParameterObjectpublic 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 无法识别为文件类型,文件参数不会显示为文件上传控件

  • @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();
    
  3. 文档生成失败排查

    检查控制器是否被扫描:确保 @RestController 位于 springdoc.packages-to-scan 指定路径下

总结

SpringDoc 凭借 零配置启动注解简洁深度兼容 Spring 生态 的优势,已成为 Spring Boot API 文档的首选工具。其核心价值在于:

  • 自动化 - 减少手动维护文档的成本;
  • 标准化 - 严格遵循 OpenAPI 3 规范;
  • 可扩展 - 分组、安全控制灵活适配复杂项目。
  • 访问 http://localhost:8080/swagger-ui.html 即可查看交互式文档(默认路径)

到此这篇关于SpringDoc基本使用的方法示例的文章就介绍到这了,更多相关SpringDoc使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java的常用包

    Java的常用包

    本文主要对Java的常用包进行一一介绍。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • ShardingSphere 分库分表原理与Spring Boot集成实践方案

    ShardingSphere 分库分表原理与Spring Boot集成实践方案

    本文探讨了ShardingSphere分库分表原理及其Spring Boot集成方案,详细阐述了SQL解析、分片路由、SQL改写、结果归并和事务管理等关键技术原理,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • IDEA禁用JVM代理设置过程

    IDEA禁用JVM代理设置过程

    在IntelliJ IDEA中禁用JVM启动代理设置的方法,解决网络超时和项目启动失败问题,通过配置特定的JVM参数,明确指示JVM不使用任何HTTP/HTTPS或socks代理进行网络通信,此方法适用于解决IDEA内置工具和项目启动项目因代理配置错误导致的问题
    2026-05-05
  • Spring中ClassPathXmlApplicationContext类的使用详解

    Spring中ClassPathXmlApplicationContext类的使用详解

    这篇文章主要介绍了Spring中ClassPathXmlApplicationContext类的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • springboot注册拦截器所遇到的问题

    springboot注册拦截器所遇到的问题

    这篇文章主要介绍了springboot注册拦截器的方法及所遇到的问题,需要的朋友可以参考下
    2018-07-07
  • Java日常练习题,每天进步一点点(39)

    Java日常练习题,每天进步一点点(39)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • 一篇文章学会java死锁与CPU 100%的排查

    一篇文章学会java死锁与CPU 100%的排查

    这篇文章主要介绍了一篇文章学会java死锁与CPU 100%的排查,文中主要介绍了Java死锁以及服务器CPU占用率达到100%时的排查和解决方法,感兴趣的朋友一起来看一看吧
    2021-08-08
  • SpringCloud的JPA连接PostgreSql的教程

    SpringCloud的JPA连接PostgreSql的教程

    这篇文章主要介绍了SpringCloud的JPA接入PostgreSql 教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-06-06
  • MyBatis深入分析数据库交互与关系映射

    MyBatis深入分析数据库交互与关系映射

    这篇文章主要介绍了MyBatis中的数据库交互与关系映射,MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,需要的朋友可以参考下
    2024-05-05
  • Java实现带缓冲的输入输出流

    Java实现带缓冲的输入输出流

    本文详细讲解了Java实现带缓冲的输入输出流,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04

最新评论