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
上一篇 1小时前
下一篇 1小时前

相关推荐

  • Java集成Dify AI服务的客户端工具包

    项目源码 Dify Java SDK是为Java开发者设计的开源工具包,专门用于与Dify AI平台的无缝对接。该工具包全面覆盖了Dify平台的各项API功能,使开发者能够便捷地在Java应用中调用AI服务。 核心功能 本工具包具备以下主要特性: 1. 多场景应用支持 智能对话系统:通过专用接口实现多轮对话管理 文本自动生成:支持各类文本内容的智能创作 流程…

    未分类 2025 年 5 月 13 日
    22300
  • Spring事务管理深度解析-从实践到原理

    事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: “`java try { //TODO something transactionManager.commit(status); } catch (E…

    2024 年 12 月 26 日
    27800
  • 2025年最新DataGrip激活码与永久破解教程 🔥 附注册码及破解方法

    2025年最新DataGrip激活码与永久破解教程 🔥 附注册码及破解方法 在使用DataGrip进行数据库开发时,很多小伙伴可能会遇到需要激活码的情况😅。本文将为大家详细介绍如何获取最新的DataGrip激活码,以及一些破解方法,但请注意,我们更推荐使用正版软件哦✨! DataGrip激活码获取方法 首先,我们可以尝试通过JetBrains官网获取官方的D…

    DataGrip破解教程 2025 年 5 月 19 日
    31200
  • 2025年最新DataGrip激活码及永久破解教程(支持2099年)

    适用于Jetbrains全系列开发工具 本教程详细讲解如何为DataGrip等Jetbrains产品获取永久授权,以下为成功破解至2099年的效果展示: 本方法具有以下优势特点:- 全平台兼容:Windows/Mac/Linux系统均可使用- 版本通用性强- 操作简单,成功率极高 下载DataGrip安装包 已安装用户可跳过此步骤 访问Jetbrains官网…

    DataGrip激活码 2025 年 7 月 25 日
    6800
  • 2025年最新DataGrip永久破解教程(附激活码/注册码)🔥

    还在为DataGrip的试用期到期而烦恼吗?🤔 本教程将手把手教你如何永久破解DataGrip至2099年!适用于Windows系统,操作简单,成功率超高!💯 🚀 本教程同样适用于JetBrains全家桶(IDEA、PyCharm、Goland等) 先来看看破解成功后的效果吧!有效期直接拉到2099年,简直不要太爽!🎉 第一步:下载DataGrip安装包 如…

    DataGrip激活码 2025 年 7 月 1 日
    20900

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信