神器SpringDoc横空出世!最适合SpringBoot的
之前在SpringBoot项目中一直使用的是SpringFox提供的Swagger库,上了下官网发现已经有接近两年没出新版本了!前几天升级了SpringBoot2。6。x版本,发现这个库的兼容性也越来越不好了,有的常用注解属性被废弃了居然都没提供替代!无意中发现了另一款Swagger库SpringDoc,试用了一下非常不错,推荐给大家!SpringDoc简介
SpringDoc是一款可以结合SpringBoot使用的API文档生成工具,基于OpenAPI3,目前在Github上已有1。7KStar,更新发版还是挺勤快的,是一款更好用的Swagger库!值得一提的是SpringDoc不仅支持SpringWebMvc项目,还可以支持SpringWebFlux项目,甚至SpringRest和SpringNative项目,总之非常强大,下面是一张SpringDoc的架构图。
使用
接下来我们介绍下SpringDoc的使用,使用的是之前集成SpringFox的malltinyswagger项目,我将把它改造成使用SpringDoc。集成
首先我们得集成SpringDoc,在pom。xml中添加它的依赖即可,开箱即用,无需任何配置。!springdoc官方StarterdependencygroupIdorg。springdocgroupIdspringdocopenapiuiartifactIdversion1。6。6versiondependency从SpringFox迁移我们先来看下经常使用的Swagger注解,看看SpringFox的和SpringDoc的有啥区别,毕竟对比已学过的技术能该快掌握新技术;
接下来我们对之前Controller中使用的注解进行改造,对照上表即可,之前在Api注解中被废弃了好久又没有替代的description属性终于被支持了!品牌管理ControllerCreatedbymacroon2019419。Tag(namePmsBrandController,description商品品牌管理)ControllerRequestMapping(brand)publicclassPmsBrandController{AutowiredprivatePmsBrandServicebrandService;privatestaticfinalLoggerLOGGERLoggerFactory。getLogger(PmsBrandController。class);Operation(summary获取所有品牌列表,description需要登录后访问)RequestMapping(valuelistAll,methodRequestMethod。GET)ResponseBodypublicCommonResultListPmsBrandgetBrandList(){returnCommonResult。success(brandService。listAllBrand());}Operation(summary添加品牌)RequestMapping(valuecreate,methodRequestMethod。POST)ResponseBodyPreAuthorize(hasRole(ADMIN))publicCommonResultcreateBrand(RequestBodyPmsBrandpmsBrand){CommonResultcommonResult;intcountbrandService。createBrand(pmsBrand);if(count1){commonResultCommonResult。success(pmsBrand);LOGGER。debug(createBrandsuccess:{},pmsBrand);}else{commonResultCommonResult。failed(操作失败);LOGGER。debug(createBrandfailed:{},pmsBrand);}returncommonResult;}Operation(summary更新指定id品牌信息)RequestMapping(valueupdate{id},methodRequestMethod。POST)ResponseBodyPreAuthorize(hasRole(ADMIN))publicCommonResultupdateBrand(PathVariable(id)Longid,RequestBodyPmsBrandpmsBrandDto,BindingResultresult){CommonResultcommonResult;intcountbrandService。updateBrand(id,pmsBrandDto);if(count1){commonResultCommonResult。success(pmsBrandDto);LOGGER。debug(updateBrandsuccess:{},pmsBrandDto);}else{commonResultCommonResult。failed(操作失败);LOGGER。debug(updateBrandfailed:{},pmsBrandDto);}returncommonResult;}Operation(summary删除指定id的品牌)RequestMapping(valuedelete{id},methodRequestMethod。GET)ResponseBodyPreAuthorize(hasRole(ADMIN))publicCommonResultdeleteBrand(PathVariable(id)Longid){intcountbrandService。deleteBrand(id);if(count1){LOGGER。debug(deleteBrandsuccess:id{},id);returnCommonResult。success(null);}else{LOGGER。debug(deleteBrandfailed:id{},id);returnCommonResult。failed(操作失败);}}Operation(summary分页查询品牌列表)RequestMapping(valuelist,methodRequestMethod。GET)ResponseBodyPreAuthorize(hasRole(ADMIN))publicCommonResultCommonPagePmsBrandlistBrand(RequestParam(valuepageNum,defaultValue1)Parameter(description页码)IntegerpageNum,RequestParam(valuepageSize,defaultValue3)Parameter(description每页数量)IntegerpageSize){ListPmsBrandbrandListbrandService。listBrand(pageNum,pageSize);returnCommonResult。success(CommonPage。restPage(brandList));}Operation(summary获取指定id的品牌详情)RequestMapping(value{id},methodRequestMethod。GET)ResponseBodyPreAuthorize(hasRole(ADMIN))publicCommonResultPmsBrandbrand(PathVariable(id)Longid){returnCommonResult。success(brandService。getBrand(id));}}接下来进行SpringDoc的配置,使用OpenAPI来配置基础的文档信息,通过GroupedOpenApi配置分组的API文档,SpringDoc支持直接使用接口路径进行配置。SpringDocAPI文档相关配置Createdbymacroon202234。ConfigurationpublicclassSpringDocConfig{BeanpublicOpenAPImallTinyOpenAPI(){returnnewOpenAPI()。info(newInfo()。title(MallTinyAPI)。description(SpringDocAPI演示)。version(v1。0。0)。license(newLicense()。name(Apache2。0)。url(https:github。commacrozhengmalllearning)))。externalDocs(newExternalDocumentation()。description(SpringBoot实战电商项目mall(50KStar)全套文档)。url(http:www。macrozheng。com));}BeanpublicGroupedOpenApipublicApi(){returnGroupedOpenApi。builder()。group(brand)。pathsToMatch(brand)。build();}BeanpublicGroupedOpenApiadminApi(){returnGroupedOpenApi。builder()。group(admin)。pathsToMatch(admin)。build();}}结合SpringSecurity使用由于我们的项目集成了SpringSecurity,需要通过JWT认证头进行访问,我们还需配置好SpringDoc的白名单路径,主要是Swagger的资源路径;SpringSecurity的配置Createdbymacroon2018426。ConfigurationEnableWebSecurityEnableGlobalMethodSecurity(prePostEnabledtrue)publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{Overrideprotectedvoidconfigure(HttpSecurityhttpSecurity)throwsException{httpSecurity。csrf()由于使用的是JWT,我们这里不需要csrf。disable()。sessionManagement()基于token,所以不需要session。sessionCreationPolicy(SessionCreationPolicy。STATELESS)。and()。authorizeRequests()。antMatchers(HttpMethod。GET,Swagger的资源路径需要允许访问,swaggerui。html,swaggerui,。html,favicon。ico,。html,。css,。js,swaggerresources,v3apidocs)。permitAll()。antMatchers(adminlogin)对登录注册要允许匿名访问。permitAll()。antMatchers(HttpMethod。OPTIONS)跨域请求会先进行一次options请求。permitAll()。anyRequest()除上面外的所有请求全部需要鉴权认证。authenticated();}}然后在OpenAPI对象中通过addSecurityItem方法和SecurityScheme对象,启用基于JWT的认证功能。SpringDocAPI文档相关配置Createdbymacroon202234。ConfigurationpublicclassSpringDocConfig{privatestaticfinalStringSECURITYSCHEMENAMEBearerAuth;BeanpublicOpenAPImallTinyOpenAPI(){returnnewOpenAPI()。info(newInfo()。title(MallTinyAPI)。description(SpringDocAPI演示)。version(v1。0。0)。license(newLicense()。name(Apache2。0)。url(https:github。commacrozhengmalllearning)))。externalDocs(newExternalDocumentation()。description(SpringBoot实战电商项目mall(50KStar)全套文档)。url(http:www。macrozheng。com))。addSecurityItem(newSecurityRequirement()。addList(SECURITYSCHEMENAME))。components(newComponents()。addSecuritySchemes(SECURITYSCHEMENAME,newSecurityScheme()。name(SECURITYSCHEMENAME)。type(SecurityScheme。Type。HTTP)。scheme(bearer)。bearerFormat(JWT)));}}测试接下来启动项目就可以访问Swagger界面了,访问地址:http:localhost:8088swaggerui。html
我们先通过登录接口进行登录,可以发现这个版本的Swagger返回结果是支持高亮显示的,版本明显比SpringFox来的新;
然后通过认证按钮输入获取到的认证头信息,注意这里不用加bearer前缀;
之后我们就可以愉快地访问需要登录认证的接口了;
看一眼请求参数的文档说明,还是熟悉的Swagger样式!
常用配置
SpringDoc还有一些常用的配置可以了解下,更多配置可以参考官方文档。springdoc:swaggerui:修改SwaggerUI路径path:swaggerui。html开启SwaggerUI界面enabled:trueapidocs:修改apidocs路径path:v3apidocs开启apidocsenabled:true配置需要生成接口文档的扫描包packagestoscan:com。macro。mall。tiny。controller配置需要生成接口文档的接口路径pathstomatch:brand,admin总结
在SpringFox的Swagger库好久不出新版的情况下,迁移到SpringDoc确实是一个更好的选择。今天体验了一把SpringDoc,确实很好用,和之前熟悉的用法差不多,学习成本极低。而且SpringDoc能支持WebFlux之类的项目,功能也更加强大,使用SpringFox有点卡手的朋友可以迁移到它试试!参考资料项目地址:https:github。comspringdocspringdocopenapi官方文档:https:springdoc。org项目源码地址
https:github。commacrozhengmalllearningtreemastermalltinyspringdoc
来源:https:mp。weixin。qq。comsscityFhZp9BOJorZSdCG0w
生脉饮的功效与作用气阴两亏喝它好生脉饮是一款保健品,很多人听到这个名字都不明白这个药主要是干嘛的,下面5号网的小编为你们介绍生脉饮的功效与作用气阴两亏喝它好。生脉饮的功效与作用生脉饮是一种药效非常出色的……
张宁益与马琳结束6年婚姻,恩爱如过眼云烟,还闹到了法庭我以为领了结婚证不算结婚,办了喜酒结婚宴才算真正的结婚了这是马琳的著名金句,也是他与张宁益离婚时付出千万资产的根源。但千万财产并没有让张宁益就此封口,……
牛黄清胃丸一次吃多少?一次吃两粒牛黄清胃丸在胃不舒服的时候吃很好,有的人不清楚一次吃多少好,下面5号网的小编为你们介绍牛黄清胃丸一次吃多少?一次吃两粒。牛黄清胃丸一次吃多少药物的服用方法是否正确也是非常……
三九胃泰儿童能吃吗?儿童吃无害现在人的饮食习惯不好,一些儿童甚至都有胃病,下面5号网的小编为你们介绍三九胃泰儿童能吃吗?儿童吃无害。三九胃泰儿童能吃吗三九胃泰颗粒含糖冲剂为棕色颗粒,味甜而苦、辛;无糖……
湖人终于赢了!这是什么庆祝舞步?要说现在的湖人真的让人着急要么领先被反超,要么就一直被压着打感觉打哪队都是五五开,总是差那么点意思这药是不是不好买了??浓眉因为感冒发烧,今天未能出战……
张国荣隔空对话说了什么?张国荣隔空对话是怎么回事?4月1日不仅仅是愚人节,也是张国荣逝世十三周年纪念日。百老汇影城传来的隔空对话,让很多粉丝飙泪,哥哥隔空对话说了什么?梁朝伟对哥哥说了什么?隔空对话是怎么回事?张国荣隔空……
包贝尔婚礼是什么时候?包贝尔的老婆是谁?包贝尔婚礼在即,不少明星前往巴厘岛去参加婚礼?包贝尔婚礼是什么时候?包贝尔的新娘又是谁呢?他们又是怎么认识的呢?包贝尔婚礼因电影《致我们终将逝去的青春》中的老张而被……
吃鱼卡刺窒息死亡喉咙卡刺怎么办小窍门鱼,营养价值高,是餐桌上最常见的营养性食物。可是,吃鱼很费力,尤其是鱼刺多,万一不小心卡在喉咙那,吐不出来吞下难受更是要命。男子吃鱼卡刺窒息死亡2016年3月31日,钱某……
蒸汽眼罩是一次性的吗?蒸汽眼罩只能用一次吗?蒸汽眼罩,是一种可以缓解眼睛疲劳,视力模糊,用眼过度的产品。不少人困惑,蒸汽眼罩是一次性的吗?关于,蒸汽眼罩是一次性的吗?蒸汽眼罩只能用一次吗?5号网小编来为您一一解答!蒸汽眼……
嘌呤大王或被找出,比海鲜含量还高,尿酸高的人尽量管住嘴高尿酸已经被称为继高血压、高血糖、高血脂后的第四高,如今高尿酸血症的患者逐年增多,患者人群也趋于年轻化,根据调查显示,我国大约有2。5亿高尿酸患者,其中有1亿多人都出现了痛风的……
冬季喜欢添嘴唇是什么原因在冬季我们总是会不知不觉的舔嘴唇,也不知道是什么原因,不过也没出什么问题,所以很多人也不怎么在意,今天小编这里就来为大家详细解答一下!为什么喜欢舔嘴唇冬季比较干燥,……
鞋子很臭怎么去除味道呢鞋子很臭这一点相信无论男女都有遇到,不管是发生在自己的身上还是朋友身上,当时都会觉得比较尴尬,那么当有这些情况的时候,我们如何可以快速的去除这些鞋子上的味道净化我们呼吸的空气呢……
达克宁能治灰指甲吗?达克宁能擦脸吗?真菌感染是比较常见的疾病,达克宁也是作为真菌感染的常用药,下面5号网的小编为你们介绍达克宁能治灰指甲吗?达克宁能擦脸吗?达克宁能治灰指甲吗甲癣,俗称灰指甲,是指皮癣菌侵犯……
男篮二战澳大利亚,谁注意徐杰?两教练重点培养,练杀器欲暴走在已经结束的两场世预赛比赛中,徐杰的发挥都不错。其中第一场比赛对阵澳大利亚,第三节他和郭艾伦的出色防守让球队迫近比分。而在第二场对阵中国台北,徐杰进攻端的发挥依然非常稳定。从目……
卫生巾用多久换一次?卫生巾几个小时换一次?卫生巾,是女性每个月都会使用的物品。特别要注意,选择适合自己的卫生巾最重要!不少人困惑,卫生巾用多久换一次?关于,卫生巾用多久换一次?卫生巾几个小时换一次?5号网小编来为您一一……
人间最美四月天头号周刊人间最美四月天。四月,到希望的田野中去走走。看天,瓦蓝瓦蓝。丝丝缕缕的云,在天际漂流。一群群清脆的鸟叫声打破了田野的宁静。我放开喉咙一声大喊我来了!只见鸟儿……
卫生巾会过期吗?卫生巾的保质期是多久?卫生巾是我们生活中,比较常见的物品。很多女性因为工作繁忙,会一次性储存很多包使用。但也有不少人困惑,卫生巾会过期吗?关于,卫生巾会过期吗?卫生巾的保质期是多久?5号网小编来为您……
锦鲤多少钱一条?锦鲤怎么养不容易死养鱼,是一件很有学问的事情,很多人都喜欢养鱼,但是并不代表人们都会养,而不会把鱼养死。那么,锦鲤多少钱一条?锦鲤怎么养不容易死?锦鲤多少钱一条1、按照规格色彩锦鲤都是几十……
必利劲是伟哥吗?必利劲是处方药吗?必利劲这个名字虽然没有万艾可响亮,但是也是很出名的,下面5号网的小编为你们介绍必利劲是伟哥吗?必利劲是处方药吗?必利劲是伟哥吗从作用机制上来说,必利劲和伟哥就有了本质上的……
金戈是什么?金戈是伟哥吗?对于男性来说,不行是一件非常没有面子的事情,很多男性会通过吃药来改善,下面5号网的小编为你们介绍金戈是什么?金戈是伟哥吗?金戈是什么广州白云山医药集团有限公司2014年0……
全球变暖会对环境造成严重影响,你知道导致全球变暖的原因吗?自1880年开始记录以来,地球的温度水平一直在稳步上升。然后,全球变暖的速度在20世纪中叶加快,到20世纪末又再次加快。因此,地球现在正经历着现代历史上最温暖的气候。01……
瓷娃娃是什么意思?脆骨病应该如何治疗?有的时候,会偶尔听到别人说瓷娃娃这个词。那么,瓷娃娃是什么意思呢?瓷娃娃是什么意思很容易受伤的孩子像瓷器一样,一摔就碎瓷娃娃,寓意成骨不全症患者犹如瓷器做的洋……
百蕊颗粒是儿童药吗?是成人药百蕊颗粒是一款效果非常不错的药品,很多人认为这个药是儿童药,下面5号网的小编为你们介绍百蕊颗粒是儿童药吗?是成人药。百蕊颗粒是儿童药吗百蕊颗粒儿童是可以服用的,百蕊颗粒新……
匹多莫德分散片能长期服用吗?匹多莫德分散片的副作用是什么匹多莫德分散片一种免疫增强剂的药品,那么问题来了,匹多莫德分散片是否可以长期服用呢?长期服用的话副作用是什么呢?下面我们来一起介绍下吧!匹多莫德分散片【药品名称】匹……