SpringDoc:一款最适合 SpringBoot 的API文档工具

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

之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升级了SpringBoot 2.6.x 版本,发现这个库的兼容性也越来越不好了,有的常用注解属性被废弃了居然都没提供替代!无意中发现了另一款Swagger库SpringDoc,试用了一下非常不错,推荐给大家!

SpringDoc简介

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

​

使用

接下来我们介绍下SpringDoc的使用,使用的是之前集成SpringFox的mall-tiny-swagger项目,我将把它改造成使用SpringDoc。

集成

首先我们得集成SpringDoc,在pom.xml中添加它的依赖即可,开箱即用,无需任何配置。

<!--springdoc 官方Starter--> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>1.6.6</version> </dependency>

从SpringFox迁移

  • 我们先来看下经常使用的Swagger注解,看看SpringFox的和SpringDoc的有啥区别,毕竟对比已学过的技术能该快掌握新技术;

​

  • 接下来我们对之前Controller中使用的注解进行改造,对照上表即可,之前在@Api注解中被废弃了好久又没有替代的description属性终于被支持了!

/**

* 品牌管理Controller

* Created by macro on 2019/4/19.

*/

@Tag(name = "PmsBrandController", description = "商品品牌管理")

@Controller

@RequestMapping("/brand") public class PmsBrandController {

@Autowired private PmsBrandService brandService; private static final Logger LOGGER = LoggerFactory.getLogger(PmsBrandController.class);

@Operation(summary = "获取所有品牌列表",description = "需要登录后访问") @RequestMapping(value = "listAll", method = RequestMethod.GET)

@ResponseBody public CommonResult<List<PmsBrand>> getBrandList() { return CommonResult.success(brandService.listAllBrand()); }

@Operation(summary = "添加品牌")

@RequestMapping(value = "/create", method = RequestMethod.POST)

@ResponseBody

@PreAuthorize("hasRole('ADMIN')") public CommonResult createBrand(

@RequestBody PmsBrand pmsBrand) { CommonResult commonResult; int count = brandService.createBrand(pmsBrand); if (count == 1) { commonResult = CommonResult.success(pmsBrand); LOGGER.debug("createBrand success:{}", pmsBrand); } else { commonResult = CommonResult.failed("操作失败"); LOGGER.debug("createBrand failed:{}", pmsBrand); } return commonResult; }

@Operation(summary = "更新指定id品牌信息") @RequestMapping(value = "/update/{id}", method = RequestMethod.POST) @ResponseBody @PreAuthorize("hasRole('ADMIN')") public CommonResult updateBrand(

@PathVariable("id") Long id, @RequestBody PmsBrand pmsBrandDto, BindingResult result) { CommonResult commonResult; int count = brandService.updateBrand(id, pmsBrandDto); if (count == 1) { commonResult = CommonResult.success(pmsBrandDto); LOGGER.debug("updateBrand success:{}", pmsBrandDto); } else { commonResult = CommonResult.failed("操作失败"); LOGGER.debug("updateBrand failed:{}", pmsBrandDto); } return commonResult; }

@Operation(summary = "删除指定id的品牌") @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)

@ResponseBody @PreAuthorize("hasRole('ADMIN')") public CommonResult deleteBrand(

@PathVariable("id") Long id) { int count = brandService.deleteBrand(id); if (count == 1) { LOGGER.debug("deleteBrand success :id={}", id); return CommonResult.success(null); } else { LOGGER.debug("deleteBrand failed :id={}", id); return CommonResult.failed("操作失败"); }

}

@Operation(summary = "分页查询品牌列表")

@RequestMapping(value = "/list", method = RequestMethod.GET) @ResponseBody

@PreAuthorize("hasRole('ADMIN')") public CommonResult<CommonPage<PmsBrand>> listBrand(@RequestParam(value = "pageNum", defaultValue = "1")

@Parameter(description = "页码") Integer pageNum,

@RequestParam(value = "pageSize", defaultValue = "3")

@Parameter(description = "每页数量") Integer pageSize) { List<PmsBrand> brandList = brandService.listBrand(pageNum, pageSize); return CommonResult.success(CommonPage.restPage(brandList));

}

@Operation(summary = "获取指定id的品牌详情")

@RequestMapping(value = "/{id}", method = RequestMethod.GET)

@ResponseBody

@PreAuthorize("hasRole('ADMIN')")

public CommonResult<PmsBrand> brand(@PathVariable("id") Long id)

{ return CommonResult.success(brandService.getBrand(id)); }

}

  • 接下来进行SpringDoc的配置,使用OpenAPI来配置基础的文档信息,通过GroupedOpenApi配置分组的API文档,SpringDoc支持直接使用接口路径进行配置。

/**

* SpringDoc API文档相关配置 * Created by macro on 2022/3/4. */

@Configuration public class SpringDocConfig {

@Bean public OpenAPI mallTinyOpenAPI() { return new OpenAPI() .info(new Info().title("Mall-Tiny 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(50K+Star)全套文档") .url("http://www.macrozheng.com")); }

@Bean public GroupedOpenApi publicApi() { return GroupedOpenApi.builder() .group("brand") .pathsToMatch("/brand/**") .build(); }

@Bean public GroupedOpenApi adminApi() { return GroupedOpenApi.builder() .group("admin") .pathsToMatch("/admin/**") .build(); } }

结合SpringSecurity使用

  • 由于我们的项目集成了SpringSecurity,需要通过JWT认证头进行访问,我们还需配置好SpringDoc的白名单路径,主要是Swagger的资源路径;

/**

* SpringSecurity的配置 * Created by macro on 2018/4/26. */

@Configuration @EnableWebSecurity

@EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override protected void configure(HttpSecurity httpSecurity) throws Exception { httpSecurity.csrf()// 由于使用的是JWT,我们这里不需要csrf

.disable() .sessionManagement()// 基于token,所以不需要session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

.and() .authorizeRequests() .antMatchers(HttpMethod.GET, // Swagger的资源路径需要允许访问 "/", "/swagger-ui.html", "/swagger-ui/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js", "/swagger-resources/**", "/v3/api-docs/**" )

.permitAll() .antMatchers("/admin/login")// 对登录注册要允许匿名访问

.permitAll() .antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求

.permitAll() .anyRequest()// 除上面外的所有请求全部需要鉴权认证 .authenticated(); } }

  • 然后在OpenAPI对象中通过addSecurityItem方法和SecurityScheme对象,启用基于JWT的认证功能。

/**

* SpringDoc API文档相关配置 * Created by macro on 2022/3/4. */

@Configuration public class SpringDocConfig { private static final String SECURITY_SCHEME_NAME = "BearerAuth";

@Bean public OpenAPI mallTinyOpenAPI() { return new OpenAPI()

.info(new Info().title("Mall-Tiny 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(50K+Star)全套文档") .url("http://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"))); } }

测试

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

​

  • 我们先通过登录接口进行登录,可以发现这个版本的Swagger返回结果是支持高亮显示的,版本明显比SpringFox来的新;

​

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

​

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

​

  • 看一眼请求参数的文档说明,还是熟悉的Swagger样式!

​

常用配置

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 # 配置需要生成接口文档的扫描包

packages-to-scan: com.macro.mall.tiny.controller # 配置需要生成接口文档的接口路径

paths-to-match: /brand/**,/admin/**

总结

在SpringFox的Swagger库好久不出新版的情况下,迁移到SpringDoc确实是一个更好的选择。今天体验了一把SpringDoc,确实很好用,和之前熟悉的用法差不多,学习成本极低。而且SpringDoc能支持WebFlux之类的项目,功能也更加强大,使用SpringFox有点卡手的朋友可以迁移到它试试!

参考资料

  • 项目地址:https://github.com/springdoc/springdoc-openapi

  • 官方文档:https://springdoc.org/

项目源码地址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-springdoc

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

相关推荐

SpringDoc【使用详解】

SpringDoc【使用详解】

qq_27480007的博客 2887

01_学习springdoc的基本使用

网上冲浪🏄🏻‍♂️时,无意间发现 java web 应用程序的在线接口文档,除了耳熟能详的 swagger 之外,还有个 springdoc。这也许就叫惊喜( ͡• ͜ʖ ͡• )还记得要使用 swagger2 的话,springboot 项目里面需要引入 springfox 的依赖。swagger2 遵循的是 OpenAPI 2 规范。现在已经有了 OpenAPI 3 规范,springdoc 便是 OpenAPI 3 和 springboot 的结合,是 springfox 的完美替代品。

ShiJunzhiCome的博客 1万+

【SpringBoot3】集成Knife4j、springdoc-openapi作为接口文档

Knife4j是一个基于 Swagger 实现的接口文档管理工具,它提供了一套简单易用的 UI 界面,用于展示和管理 Swagger 生成的 API 文档。与传统的 Swagger UI 相比,Knife4j 在 UI 设计和功能上进行了改进和增强,使得接口文档的浏览和管理更加方便和直观。Knife4j 提供了一个美观、直观的界面,用户可以通过该界面轻松地浏览和理解 API 文档,以及进行相关操作。

不积跬步无以至千里,不积小流无以成江海。一个喜欢学习分享的程序员 8498

神器 SpringDoc 横空出世最适合 SpringBoot 的API文档工具来了

Operation(summary = "获取所有品牌列表",description = "需要登录后访问") @RequestMapping(value = "listAll", method = RequestMethod.GET) @ResponseBody public CommonResult getBrandList() { return CommonResult.success(brandService.listAllBrand());

代码界的扛把子 4810

Swagger API 文档 | SpringBoot 3.x 集成 SpringDoc

SpringBoot 集成 SpringDoc,详细步骤。

甘蓝的专栏 2572

Python 映射函数map()详解

Python 映射函数map()详解

分享我的点点滴滴,在成长路上与你同行! 2141

神器 SpringDoc 横空出世,最适合 SpringBoot 的API文档工具来了~

之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升级了SpringBoot 2.6.x 版本,发现这个库的兼容性也越来越不好了,有的常用注解属性被废弃了居然都没提供替代!无意中发现了另一款Swagger库SpringDoc,试用了一下非常不错,推荐给大家!

macrozheng的专栏 2万+

一次渗透测试引发的Json格式下CSRF攻击的探索

一次渗透测试引发的Json格式下CSRF攻击的探索

weixin_52501704的博客 1050

神器 SpringDoc 横空出世,最适合 SpringBoot 的API文档工具来了

之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升级了SpringBoot 2.6.x 版本,发现这个库的兼容性也越来越不好了,有的常用注解属性被废弃了居然都没提供替代!无意中发现了另一款Swagger库SpringDoc,试用了一下非常不错,推荐给大家! SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI 3,目前在Github上已有1.7K+.

wdjnb的博客 8081

4-都2026年了,嵌入式发展前景怎么样,还适合入行吗?

本文系统分析了嵌入式行业的发展前景,指出到2026年嵌入式将迎来由"万物智联"驱动的黄金周期。文章回顾了嵌入式技术的四个演进阶段,从专用计算机到AIoT时代,强调其技术积累的延续性。作者从人才流向、产业智能化转型、高校新增专业等角度论证嵌入式行业的蓬勃发展,并提出"铁三角"模型分析其驱动力和护城河。最后给出职业发展路径建议,认为嵌入式适合长期主义者,在智能汽车、边缘计算等领域有广阔前景。文章建议读者抓住产业升级机遇,选择这一稳定且有复利效应的技术赛道。

指尖动听知识库 391

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1172

神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了!

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

weixin_42907150的博客 2708

阿里九宫格验证码 (Baxia SecCaptcha) 逆向工程与自动化求解

实现对阿里巴夏 (Baxia) 九宫格点击验证码的全自动求解模式说明依赖浏览器模式通过 Puppeteer/Playwright 控制真实浏览器,享有完整 DOM/Canvas/WASM 环境需要 Chrome/Chromium纯算模式脱离浏览器,通过 HTTP API + Node.js WASM 解密完成求解无需浏览器。

猫敷雪 401

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

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

2503_92695612的博客 7687

备战数学建模38-粒子群算法pso番外篇1(攻坚战2)

粒子群算法最初是根据鸟类群体行为得到的启发,对鸟群行为进行仿真的算法,是一种启发式算法,也就是智能优化算法,利用信息共享,通过中间信息进行改进搜索,从而获得问题的可行解。我们简单从下图去体会一下粒子群算法,就是有多个鸟,每个鸟相当于一个粒子,每只鸟的位置受自己认知的历史最佳位置和当前距离食物最近的鸟的位置的影响。我们进一步分析这个图,可以得到两个公式,第一个是速度公式,即每只鸟的当前速度受上一步的速度惯性,自我认知和社会认知三部分影响,第二个是位置公式,即每只鸟的位置受上一位置和上一位置的速度的影响。

nuist_NJUPT的博客 1666

[QMT量化交易小白入门]-三十五、如何将聚宽策略信号转为QMT实盘交易

Flask是一个轻量级的Web应用框架,它提供了简单而灵活的方式来构建Web应用程序。在本案例中,将使用Flask来搭建一个本地服务,用于监听来自jq2qmt.py脚本的交易信号,并根据信号执行相应的下单操作。

木头大左的博客 2696

项目实战API文档工具:SpringBoot整合SpringDoc

SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI 3,更新发版效率不错,是一款更好用的Swagger库,功能强大,是SpringDoc不仅支持Spring WebMVC项目,还可以支持Spring WebFlux项目,甚至Spring Rest和Spring Native项目等都可以用。

qq_40623672的博客 1813

【ArcGIS微课1000例】0068:ArcGIS加载world imagery高清卫星影像教程

本文介绍了如何在ArcGIS中加载World Imagery高清卫星影像作为谷歌影像的替代方案。通过添加ArcGIS Server并输入在线图集URL(https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer),即可连接并预览包含中国影像、青海湖、东方明珠等全球高清卫星图。该教程提供了详细的操作步骤图示,帮助用户快速获取优质底图数据,适用于地理信息分析和可视化应用。

智慧空间实验室 5420

【一款最适合 SpringBoot 的API文档工具横空出世,强烈推荐】

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

wdj_yyds的博客 2033

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

(新)秒懂SpringBoot之如何集成SpringDoc(全网目前最新最系统最全面的springdoc教程)

近来颇为懈怠,竟两月有余未发一篇博客,惭愧惭愧。值此端午佳节(dragon boat festival)作为调包高手、API小王子的我就聊聊API文档的那些事吧,如果你也是API小王子,那我们就可以在一起欢度佳节了,哈哈...我惯用Java,惯用Spring,所以这里谈论的是关于springboot中如何处理文档的内容终于写完了,要写一篇逻辑清晰,对初学者友好的博客可真不容易。当然我写博客主要是为了自己梳理知识,但是我一直秉承着解决自己初次接触时候的困难场景来写的,相信对其他小朋友会有很大的帮助。

竹林幽深 8766

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

最适合 SpringBoot 的API文档工具来了

Operation(summary="获取所有品牌列表",description="需要登录后访问")@RequestMapping(value="listAll",method=RequestMethod.GET)@ResponseBodypublicCommonResultgetBrandList(){returnCommonResult.success(brandService.listAllBrand());

m0_72730471的博客 1500

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了

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

mfmfmfo的博客 1529
上一篇: 完全免费的一款SpringBoot应用自动化部署神器
下一篇: 一款能解放双手的YYDS低代码工具,功能强大
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值