告别Swagger UI!一款更适合Spring Boot的API文档新选择!

SpringDoc和Swagger使用 Swagger和Springdoc是两个常用的工具,用于生成和维护API文档,特别是针对基于REST的Web服务。它们有效地提升了API的可读性和可维护性,帮助开发者、产品经理和其他利益相关者更好地理解和使用所提供的API。注意:Swagger支持springboot2.0但不支持springboot3.0。 阅读详情
AI摘要

本文介绍了一款新的API文档工具SpringDoc,它基于OpenAPI 3,支持Spring Boot 3,并且与SpringFox相比,提供了更好的维护和更广泛的支持。文章详细介绍了如何在Spring Boot项目中集成和配置SpringDoc,以及如何结合Spring Security进行认证授权。最后,通过一个实际的项目示例,展示了SpringDoc的基本使用方法和测试过程。

如果大家在Spring Boot中使用过Swagger,应该用过SpringFox提供的Swagger UI库,其实这个库已经不再维护了,也不支持Spring Boot 3。今天给大家分享一款更适合Spring Boot的API文档库SpringDoc,全面支持Spring Boot 3!

SpringDoc简介

SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI 3,目前在Github上已有3.5K+Star,更新发版还是挺勤快的,是一款更好用的Swagger库!值得一提的是SpringDoc不仅支持Spring WebMvc项目,还可以支持Spring WebFlux项目,甚至Spring Rest和Spring Native项目,总之非常强大,下面是一张SpringDoc的架构图。

使用

接下来介绍下SpringDoc的使用,涵盖基本使用和结合Spring Security的使用。

集成及配置

  • 首先我们需要在项目中集成SpringDoc,在pom.xml中添加它的依赖即可;
<!--SpringDoc相关依赖-->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>${springdoc-openapi.version}</version>
</dependency>
  • 然后在application.yml文件中添加SpringDoc的相关配置。
springdoc:
  swagger-ui:
    # 修改Swagger UI路径
    path: /swagger-ui.html
    # 开启Swagger UI界面
    enabled: true
  api-docs:
    # 修改api-docs路径
    path: /v3/api-docs
    # 开启api-docs
    enabled: true
  group-configs:
    - group: 'brand'
      paths-to-match: '/brand/**'
      packages-to-scan: com.macro.blog.springdoc.controller
    - group: 'admin'
      paths-to-match: '/admin/**'
      packages-to-scan: com.macro.blog.springdoc.controller
  default-flat-param-object: false

和SpringFox的对比

如果你之前使用过SpringFox的话,可以通过下表对比下其和SpringDoc的注解使用,相信能很快上手的!

SpringFox

SpringDoc

注解用途

@Api

@Tag

用于接口类,标识这个类是Swagger的资源,可用于给接口类添加说明

@ApiIgnore

@Parameter(hidden = true)or@Operation(hidden = true)or@Hidden

忽略该类的文档生成

@ApiImplicitParam

@Parameter

隐式指定接口方法中的参数,可给请求参数添加说明

@ApiImplicitParams

@Parameters

隐式指定接口方法中的参数集合,为上面注解的集合

@ApiModel

@Schema

用于实体类,声明一个Swagger的模型

@ApiModelProperty

@Schema

用于实体类的参数,声明Swagger模型的属性

@ApiOperation(value = "foo", notes = "bar")

@Operation(summary = "foo", description = "bar")

用于接口方法,标识这个类是Swagger的一个接口,可用于给接口添加说明

@ApiParam

@Parameter

用于接口方法参数,给请求参数添加说明

@ApiResponse(code = 404, message = "foo")

ApiResponse(responseCode = "404", description = "foo")

用于描述一个可能的返回结果

基本使用

这里将以mall项目中商品品牌管理的接口为例,来介绍下SpringDoc的基本使用。

::: block-1 这里简单介绍下mall项目,mall项目是一套基于SpringBoot3 + Vue 的电商系统(Github标星60K),后端支持多模块和微服务架构,采用Docker和K8S部署。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!

  • Boot项目:github.com/macrozheng/…
  • Cloud项目:github.com/macrozheng/…
  • 教程网站:www.macrozheng.com

项目演示:

:::

  • 接下来进行添加SpringDoc的Java配置配置,使用OpenAPI来配置基础的文档信息;
/**
 * @auther macrozheng
 * @description SpringDoc API文档相关配置
 * @date 2025/8/12
 * @github https://github.com/macrozheng
 */
@Configuration
public class SpringDocConfig {

    @Bean
    public OpenAPI mallTinyOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("SpringDoc API")
                        .description("SpringDoc API文档演示")
                        .version("v1.0.0")
                        .license(new License().name("Apache 2.0").url("https://github.com/macrozheng/mall-learning")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringBoot实战电商项目mall(60K+Star)全套文档")
                        .url("https://www.macrozheng.com"));
    }

}
  • 接下来创建一个商品品牌管理的Controller,具体使用可以参考表格中的注解;
/**
 * @auther macrozheng
 * @description
 * @date 2025/8/12
 * @github https://github.com/macrozheng
 */
@Tag(name = "PmsBrandController", description = "商品品牌管理")
@RestController
@RequestMapping("/brand")
public class PmsBrandController {
    @Autowired
    private PmsBrandService brandService;

    @Operation(summary = "获取所有品牌列表",description = "需要登录后访问")
    @GetMapping("/listAll")
    public CommonResult<List<PmsBrand>> listAll() {
        return CommonResult.success(brandService.listAll());
    }

    @Operation(summary = "添加品牌")
    @PostMapping("/create")
    public CommonResult create(@RequestBody PmsBrand pmsBrand) {
        CommonResult commonResult;
        int count = brandService.create(pmsBrand);
        if (count == 1) {
            commonResult = CommonResult.success(pmsBrand);
        } else {
            commonResult = CommonResult.failed("操作失败");
        }
        return commonResult;
    }

    @Operation(summary = "更新指定id品牌信息")
    @PostMapping("/update/{id}")
    public CommonResult update(@PathVariable("id") Long id, @RequestBody PmsBrand brand) {
        CommonResult commonResult;
        int count = brandService.update(id, brand);
        if (count == 1) {
            commonResult = CommonResult.success(brand);
        } else {
            commonResult = CommonResult.failed("操作失败");
        }
        return commonResult;
    }

    @Operation(summary = "删除指定id的品牌")
    @GetMapping("/delete/{id}")
    public CommonResult deleteBrand(@PathVariable("id") Long id) {
        int count = brandService.delete(id);
        if (count == 1) {
            return CommonResult.success(null);
        } else {
            return CommonResult.failed("操作失败");
        }
    }

    @Operation(summary = "分页查询品牌列表")
    @GetMapping("/list")
    public CommonResult<List<PmsBrand>> list(@RequestParam(value = "pageNum", defaultValue = "1")
                                             @Parameter(description = "页码") Integer pageNum,
                                             @RequestParam(value = "pageSize", defaultValue = "3")
                                             @Parameter(description = "每页数量") Integer pageSize) {
        List<PmsBrand> brandList = brandService.list(pageNum, pageSize);
        return CommonResult.success(brandList);
    }

    @Operation(summary = "获取指定id的品牌详情")
    @GetMapping("/{id}")
    public CommonResult<PmsBrand> detail(@PathVariable("id") Long id) {
        return CommonResult.success(brandService.detail(id));
    }
}
  • 在PmsBrand实体类中可以通过@Schema注解来标注对应的属性信息。
/**
 * @auther macrozheng
 * @description 商品品牌实体类
 * @date 2025/8/12
 * @github https://github.com/macrozheng
 */
@Data
public class PmsBrand {
    private Long id;

    private String name;

    @Schema(title = "首字母")
    private String firstLetter;

    private Integer sort;

    @Schema(title = "是否为品牌制造商:0->不是;1->是")
    private Integer factoryStatus;

    private Integer showStatus;

    @Schema(title = "产品数量")
    private Integer productCount;

    @Schema(title = "产品评论数量")
    private Integer productCommentCount;

    @Schema(title = "品牌logo")
    private String logo;

    @Schema(title = "专区大图")
    private String bigPic;

    @Schema(title = "品牌故事")
    private String brandStory;
}

结合Spring Security使用

  • 如果项目需要认证授权的话,可以结合Spring Security来使用,我已经在示例代码中集成好了Spring Security,这里不再赘述集成过程的,大家自行查看代码即可,代码地址在文末。
  • 我们还需要在OpenAPI对象中通过addSecurityItem方法和SecurityScheme对象,启用基于JWT的认证功能。
/**
 * @auther macrozheng
 * @description SpringDoc API文档相关配置
 * @date 2025/8/12
 * @github https://github.com/macrozheng
 */
@Configuration
public class SpringDocConfig {

    private static final String SECURITY_SCHEME_NAME = "Authorization";

    @Bean
    public OpenAPI mallTinyOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("SpringDoc API")
                        .description("SpringDoc API文档演示")
                        .version("v1.0.0")
                        .license(new License().name("Apache 2.0").url("https://github.com/macrozheng/mall-learning")))
                .externalDocs(new ExternalDocumentation()
                        .description("SpringBoot实战电商项目mall(60K+Star)全套文档")
                        .url("https://www.macrozheng.com"))
                .addSecurityItem(new SecurityRequirement().addList(SECURITY_SCHEME_NAME))
                .components(new Components()
                        .addSecuritySchemes(SECURITY_SCHEME_NAME,
                                new SecurityScheme()
                                        .name(SECURITY_SCHEME_NAME)
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")));
    }

}

测试

  • 接下来启动项目就可以访问API文档页面了,访问地址:http://localhost:8088/swagger-ui.html

  • 我们先通过登录接口获取token,默认账号密码为admin:123456;

  • 然后通过认证按钮输入获取到的认证头信息,注意这里不用加Bearer前缀;

  • 之后我们就可以访问需要登录认证的接口了;

  • 如果没有添加认证请求头访问接口的话,会返回如下信息;

  • 在接口的请求参数中,我们也可以看到之前通过@Schema添加的属性信息。

总结

今天带大家学习了下SpringDoc,确实很好用,和SpringFox的用法差不多,学习成本极低。而且SpringDoc能支持WebFlux之类的项目,功能也更加强大,感兴趣的朋友可以试试!

项目地址

github.com/springdoc/s…

项目源码地址

github.com/macrozheng/…

(全网最全) SpringDoc详解(从入门到精通,一文搞定) SpringDoc详解 阅读详情

相关推荐

SpringDoc注解解析

SpringDoc注解的使用,它是基于OpenAPI 3和Swagger 3的现代化解决方案,相较于旧版的Swagger2(SpringFox),SpringDoc提供了更简洁、更直观的注解方式。

qq_29012499的博客 8607

java:springboot3集成swagger(springdoc-openapi-starter-webmvc-ui)

springboot3集成swagger报错Typejavax.servlet.http.HttpServletRequest not present,来使用springdoc-openapi-starter-webmvc-ui

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 7685

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 487

Spring Boot 3.x 引入springdoc-openapi (内置Swagger UI、webmvc-api)

在 spring boot3.x 中使用 springdoc-openapi,其中集成了swagger ui 与 webmvc api

道阻且长 心态要好 2万+

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 795

保姆级教程:用STM32CubeMX配置GD32的CAN总线(含异常处理)

本文提供了一份详细的STM32CubeMX配置GD32 CAN总线开发指南,涵盖从HAL库移植到异常处理的全过程。重点解析GD32与STM32在CAN总线初始化、报文发送优先级处理等方面的关键差异,并提供优化代码维护与版本控制的实用策略,帮助开发者高效完成项目迁移。

onion的博客 831

告别Swagger UI!SpringBoot整合SpringDoc OpenAPI:更强大的API文档新选择

本文简单介绍了Spring环境中整合Swagger替代SpringFox的新方式:SpringDoc

2503_92695612的博客 7688

GAMES101学习-第8课进行shader的初步了解

详细理解课上展示的像素着色器GLSL,以及了解了API、OpenGL、DirectX到底是什么,还有shadertoy这个网站的初步探索。

qq_41835314的博客 1917

告别Swagger UI!一款更适合 SpringBoot 的API文档新选择

以上就是今天要讲的内容,本文简单介绍了SpringDoc整合在SpringBoot项目中的步骤,如果有遗漏,请大家留言,看到后会进行补充。

m0_73735578的博客 911

32位ALU设计(verilog实现)

32位ALU设计 ​ 算术逻辑单元(arithmetic and logic unit) 是能实现多组算术运算和逻辑运算的组合逻辑电路,简称ALU。算术逻辑单元是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"And Gate"(与门) 和"Or Gate"(或门)构成的算术逻辑单元,主要功能是进行二位元的算术运算,如加减乘(不包括整数除法)。基本上,在所有现代CPU体系结构中,二进制都以补码的形式来表示。 设计思路 设计实现 仿真测试 文章目录32位ALU设计一、设计

Destiny的博客 4万+

基于Xilinx XDMA 的PCIE通信

基于Xilinx XDMA 的PCIE通信 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 PCI Express Base Specification Revision 5.0 pg195-pcie-dma PCI Express体系

Crazzy_M的博客 1万+

告别传统Swagger!yudao-swagger-new-ui让API文档颜值与功能齐飞

在API开发过程中,一个清晰、易用的文档工具至关重要。传统Swagger UI虽然功能全面,但在视觉体验和交互设计上已显陈旧。yudao-swagger-new-ui作为全新一代的Swagger UI解决方案,不仅完美支持所有核心功能,还带来了颠覆性的界面设计和用户体验,让API文档既美观又实用。 ## 🌟 为什么选择yudao-swagger-new-ui? yudao-swagger-n

gitblog_00205的博客 1100

使用 YOLO26 的牙科全景X光片分析:从牙齿检测到疾病诊断

从数据预处理自动化、模型架构针对性优化到基于视觉特征的性能分析。它证明了在医学图像分析中,模型架构的进步(如YOLO26的特性)可以有效缓解数据不平衡和目标微小的问题,为临床自动化诊断提供了一个高效、可靠的解决方案。Python"""全局配置模块包含数据集路径、类别名称、论文复现参数、划分比例等常量"""import os# ==================== 路径配置 ====================

u012133341的博客 102

告别SwaggerUI!一款更适合SpringBoot的API文档新选择

以上就是今天要讲的内容,本文简单介绍了SpringDoc整合在SpringBoot项目中的步骤,如果有遗漏,请大家留言,看到后会进行补充。

IT_1024的博客 1446

152:vue+leaflet 判断一个点是否在一个电子围栏内

本文介绍了一个基于Vue+Leaflet的示例,演示如何判断点是否在电子围栏内。作者大剑师兰特(优快云知名博主)展示了使用polygon.getBounds().contains(latlng)方法检测点与多边形边界的关系。代码仅需80行,通过点击地图触发判断逻辑,结果显示提示信息。该技术可广泛应用于地理围栏、位置服务等场景,需要安装turf依赖。文章提供了完整源码和配置说明,适合GIS开发者学习参考。

大剑师兰特的GIS世界 758

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: 还在用WebSocket实现即时通讯?试试MQTT吧,真香!
下一篇: 一行代码搞定文件存储!这个万能通用的文件存储方案,太香了!
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值