范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

SpringBoot进阶详解SpringBoot中使用Swagger3。0

  在上篇文章中我们介绍了Spring Boot 整合Swagger3.0的一些基础用法,这篇文章中我们来深入学习一下Swagger3.0 还有其他高级用法。
  在日常的开发中,为了减少工作量,我们会遇到一种情况,就是将前端的接口与后端的接口编写到同一个代码中,这样也提高了代码的复用率,减少了重复开发代码的工作量。这个时候我们就需要将接口文档也进行拆分。分为前端接口和后端接口两个部分。
  在Swagger3.0中如何进行接口分组呢?Swagger3.0 接口分组操作
  通过之前的例子我们知道,我们往容器中注入一个Docket就是注入了一个文档,其中我们设置了groupName的分组名称。要想注入多个文档,意思就是需要往容器中注入多个Docket。既然是这样,我们就需要修改之前的Swagger的配置文件,将其改为如下的代码。@EnableOpenApi @Configuration @EnableConfigurationProperties(value = {SwaggerProperties.class}) public class Swagger3Config {      @Autowired     private SwaggerProperties swaggerProperties;      @Bean     public Docket frontApi(){         return new Docket(DocumentationType.OAS_30)                 // 是否开启,根据环境配置                 .enable(swaggerProperties.getFront().getEnable())                 .groupName(swaggerProperties.getFront().getGroupName())                 .apiInfo(frontApiInfo())                 .select()                 .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getFront().getBasePackege()))                 .paths(PathSelectors.any())                 .build();     }      // 前台API信息     private ApiInfo frontApiInfo(){         return new ApiInfoBuilder()                 .title(swaggerProperties.getFront().getTitle())                 .description(swaggerProperties.getFront().getDescription())                 .version(swaggerProperties.getFront().getVersion())                 .contact(                         // 添加开发者信息                         new Contact(                                 swaggerProperties.getFront().getContactName(),                                 swaggerProperties.getFront().getContactUrl(),                                 swaggerProperties.getFront().getContactEmail())                 ).build();     }       @Bean     public Docket backApi(){         return new Docket(DocumentationType.OAS_30)                 // 是否开启,根据环境配置                 .enable(swaggerProperties.getBack().getEnable())                 .groupName(swaggerProperties.getBack().getGroupName())                 .apiInfo(backApiInfo())                 .select()                 .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBack().getBasePackege()))                 .paths(PathSelectors.any())                 .build();     }      // 前台API信息     private ApiInfo backApiInfo(){         return new ApiInfoBuilder()                 .title(swaggerProperties.getBack().getTitle())                 .description(swaggerProperties.getBack().getDescription())                 .version(swaggerProperties.getBack().getVersion())                 .contact(                         // 添加开发者信息                         new Contact(                                 swaggerProperties.getBack().getContactName(),                                 swaggerProperties.getBack().getContactUrl(),                                 swaggerProperties.getBack().getContactEmail())                 ).build();     }  }
  我们会看到在这个配置类中注入了两个Docket,分别代表前端的接口和后端的接口,那么在配置文件中如何进行配置呢?
  首先我们先来看一下其配置类,代码如下@Data @ConfigurationProperties(prefix = "spring.swagger3") public class SwaggerProperties {     private SwaggerEntity front;     private SwaggerEntity back;      @Data     public static class SwaggerEntity{         private String groupName;         private String basePackege;         private String title;         private String description;         private String contactName;         private String contactEmail;         private String contactUrl;         private String version;         private Boolean enable;     } }
  全局配置类spring:   swagger3:     front:       enable: true       groupName: 前端接口       basePackege: com.example.demo.controller.api       title: 前端测试接口       description: 前端测试Spring Boot整合Swagger3.0       contactName: nihui       contactEmail: 18202504057@163.com       contactUrl: https://blog.csdn.net/nihui123       version: 0.0.1     back:       enable: true       groupName: 后端接口       basePackege: com.example.demo.controller.web       title: 后端测试接口       description: 后端测试Spring Boot整合Swagger3.0       contactName: nihui       contactEmail: 18202504057@163.com       contactUrl: https://blog.csdn.net/nihui123       version: 0.0.1   mvc:     pathmatch:       matching-strategy: ant_path_matcher
  通过上面的配置完成配置之后,就会看到在接口页面会有两个分组,一个是前端接口、一个是后端接口分组。
  添加授权认证信息
  在很多对外提供服务的API接口中,都会有一个授权认证的操作,否则这些接口是无法进行调用的。例如在一般的情况下,会在接口中包含一个TOKEN参数。
  那么在Swagger3.0中如何对这个认证信息进行配置,这样在每次请求的时候都会带着这个参数进行请求,这样就避免了我们在测试过程中,每次都需要添加这个信息的麻烦。
  要完成授权信息的添加,我们需要在Docket方法中添加如下的内容@Configuration public class BaseSwagger3Config {      @Autowired     private BaseSwagger3Properties properties;      @Bean     public Docket baseApi(){         return new Docket(DocumentationType.OAS_30)                 // 是否开启,根据环境配置                 .enable(properties.getEnable())                 .groupName(properties.getGroupName())                 .apiInfo(frontApiInfo())                 .select()                 .apis(RequestHandlerSelectors.basePackage(properties.getBasePackege()))                 .paths(PathSelectors.any())                 .build()                 .securitySchemes(securitySchemes())                 .securityContexts(securityContexts());     }      private List securitySchemes(){         ApiKey apiKey = new ApiKey("TOKEN","token", In.HEADER.toValue());         return Collections.singletonList(apiKey);     }      private List securityContexts(){         return Collections.singletonList(SecurityContext.builder().                 securityReferences(Collections.singletonList(                         new SecurityReference("TOKEN",new AuthorizationScope[]                                 {new AuthorizationScope("global","")}))).build());     }      // 前台API信息     private ApiInfo frontApiInfo(){         return new ApiInfoBuilder()                 .title(properties.getTitle())                 .description(properties.getDescription())                 .version(properties.getVersion())                 .contact(                         // 添加开发者信息                         new Contact(                                 properties.getContactName(),                                 properties.getContactUrl(),                                 properties.getContactEmail())                 ).build();     }  }
  完成上述配置之后,会看到在接口页面上会多出一个认证的按钮。通过这个认证的按钮我们可以设置对应的参数值
  添加公共参数
  在不同的平台使用的时候,除了携带请求Token之外还会有一些用户进行用户分析,大数据分析的参数被传到请求中。那么如何在Swagger3.0中去定义这些公共参数呢?这个时候我们需要在配置代码中添加如下的内容。@Configuration public class BaseSwagger3Config {      @Autowired     private BaseSwagger3Properties properties;      @Bean     public Docket baseApi(){          RequestParameter requestParameter = new RequestParameterBuilder()                 .name("clientType")                 .description("客户端类型")                 .in(ParameterType.HEADER)                 .required(true)                 .build();          //创建一个请求参数集合         List requestParameterList = Collections.singletonList(requestParameter);           return new Docket(DocumentationType.OAS_30)                 // 是否开启,根据环境配置                 .enable(properties.getEnable())                 .groupName(properties.getGroupName())                 .apiInfo(frontApiInfo())                 .select()                 .apis(RequestHandlerSelectors.basePackage(properties.getBasePackege()))                 .paths(PathSelectors.any())                 .build()                 .globalRequestParameters(requestParameterList)                 .securitySchemes(securitySchemes())                 .securityContexts(securityContexts());     }      private List securitySchemes(){         ApiKey apiKey = new ApiKey("TOKEN","token", In.HEADER.toValue());         return Collections.singletonList(apiKey);     }      private List securityContexts(){         return Collections.singletonList(SecurityContext.builder().                 securityReferences(Collections.singletonList(                         new SecurityReference("TOKEN",new AuthorizationScope[]                                 {new AuthorizationScope("global","")}))).build());     }      // 前台API信息     private ApiInfo frontApiInfo(){         return new ApiInfoBuilder()                 .title(properties.getTitle())                 .description(properties.getDescription())                 .version(properties.getVersion())                 .contact(                         // 添加开发者信息                         new Contact(                                 properties.getContactName(),                                 properties.getContactUrl(),                                 properties.getContactEmail())                 ).build();     }  }
  会看到上述代码中通过,RequestParameter定义了一个公共的参数,并且将其放入到了一个参数集合中,通过Docket的.globalRequestParameters(requestParameterList)方法将其添加到Swagger3.0文档中。然后运行项目会看到在接口中就会携带这对应的参数出现,并且这个参数是全局的,也就是说每个接口中都需要有这一个参数。
  到这里,Swagger的相关内容就告一段落了。细心的读者会发现,在前面我们添加分组配置的时候在配置类上添加了好多的注解,但是在我们演示认证信息与全局参数的时候,配置类中只是简单的添加了一个@Configuration 注解。这是为什么呢?下面我们就来探索一下源码。OpenApiAutoConfiguration 源码
  会看到在这段源码中,好像什么功能都没实现,但是它确完成了Swagger3.0大多数的配置,而对于@EnableOpenApi 注解来讲。@Configuration @EnableConfigurationProperties(SpringfoxConfigurationProperties.class) @ConditionalOnProperty(value = "springfox.documentation.enabled", havingValue = "true", matchIfMissing = true) @Import({     OpenApiDocumentationConfiguration.class,     SpringDataRestConfiguration.class,     BeanValidatorPluginsConfiguration.class,     Swagger2DocumentationConfiguration.class,     SwaggerUiWebFluxConfiguration.class,     SwaggerUiWebMvcConfiguration.class }) @AutoConfigureAfter({ WebMvcAutoConfiguration.class, JacksonAutoConfiguration.class,     HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class }) public class OpenApiAutoConfiguration {  } @EnableOpenApi 注解
  对于@EnableOpenApi注解来讲其关键的代码就是@Import(OpenApiDocumentationConfiguration.class) 引入的还是这个类。@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) @Target(value = {java.lang.annotation.ElementType.TYPE}) @Documented @Import(OpenApiDocumentationConfiguration.class) public @interface EnableOpenApi { }
  这里我们会发现为什么在没有@EnableOpenApi注解的时候也会生效呢?那就是用到了我们Spring Boot自动配置的原理了。关于自动配置的原理在后续的分析中我们来进行讲解,这里就先不做过多说明。提示大家的就是找到如下图中的代码就可以理解自动配置的原理
  总结
  通过上面的内容我们了解了Swagger3.0的一些扩展性的用法,当然Swagger的用法远远不止这些,但是这些内容已经可以支持在我们日常开发中的一些工作。希望大家多多关注,笔者会为大家带来更多精彩干活

户均仅缴存约2000元,个人养老金账户开户热缴存冷,投资热情待激活中国经济周刊经济网讯(记者谢玮)开户送大鹅,开户送小马!日前,在北京五棵松合生汇国贸等不少繁华商圈附近,频现推广个人养老金账户的银行工作人员。2022年11月25日,人社部宣布个人本田致在科技版上市1。5T爆182马力,油耗6。96L,配L2级辅助驾驶近日,本田ZRV致在2023款1。5TCVT科技版正式上市,指导价16。49万元,其燃油版也扩大到4款车型,新车重点对配置进行调整,比老款精英版有明显提升,主要对标比亚迪宋PLUS令人迷惑?海南的最西端名东方,小众到全网几乎没有攻略!不得不说,海岛度假在国内还是没有比过比海南的。但是现在的人们也不再只是疯狂挤进三亚,曾经算比较小众的万宁陵水海口也都可以说是热门目的地了。万宁旅游但是海南还有很多更加小众安静的地方中俄共同反霸之际,老朋友突然变心?美阴谋得逞,俄要求给出说法中俄共同反抗美国霸权之际,俄罗斯的老朋友似乎已经变心?美国政府的阴谋已经得逞,俄罗斯要求曾经的铁杆盟友给个说法,这也给我们提了一个醒。当前,中俄两国正在全球两个方向反抗美西方的霸权明天是九九,老人说做2事吃3样忌1事,四季安康有福气我们都有听过一句俗语,热在三伏,冷在三九,这句话中提到的三九,跟中国古代民间一种叫数九的计算寒冬的方法有关。一般是从冬至开始,每9天时间为一个九,一直数到第九个九,即九九81天,就杭州明天入春!走,赏花去!喜大普奔!春天,真的来了!近期,浙江丽水温州金华衢州台州等地已纷纷官宣入春。今天,杭州市气象台宣布杭州明天入春!预计3月4日至8日,杭州连续5天平均气温高于10,历经94天的寒冬,李克强总理,您辛苦了!再见!3月5日上午9时,第十四届全国人民代表大会第一次会议在人民大会堂举行开幕会。国务院总理李克强代表国务院,向十四届全国人大一次会议作政府工作报告。这也是李克强总理本届政府任期内的最后江门地区完成首例极低体重新生儿心包穿刺术江门市妇幼保健院近日接收了一名胎龄不足27周,体重只有870克,出生后出现青紫气促等症状的早产儿。安排入住新生儿科,给我保育箱对症治疗。不料,入院第二天,新生儿就出现触摸反应欠佳呼GDP10强城市成都没有意外,宁波应该有我,厦门差距很大GDP是衡量地区经济发展的重要参考,具有很大的研究意义。往往我们在对城市经济的评判中,会直接以GDP定输赢。GDP10强城市是所有城市的榜样。在刚刚过去的2022年中,GDP10强全国超9成小城市房价不过万元你家那边的房价贵吗?第一财经记者根据中国房价行情网和安居客的数据梳理发现,目前450个小城市中,30个城市房价平均单价过万,占比为6。7,也就是说,有93。3的小城市房价不过万元。从区域分布来看,房价继日本后,俄一座火山猛烈喷射,千米烟柱冲上云霄,外媒大胆预测有句老话说得好,世界之大,无奇不有,大意就是说,世界这么大,必然会存在一些不可思议的事情。确实如此,几日前,上万只是环鸟淹没了墨西哥的一条街道,正当有人猜测是环境危机来临之际,俄罗
90后女教师与80后男家长聊天记录曝光!都要笑喷了,哈哈哈家庭地位已经显而易见了来个文化人谁知道正确答案究竟是什么吗大爷这方向盘看着有点特别啊这应该是全网混得最差的猫了吧如何正确地发朋友圈你学会了吗乐队里这样的人一定要离远点不然容易误伤这奇葩战争,乌军拿自己人当人质,再次重演亚速钢铁厂裹挟平民现象俄乌冲突111天后,感觉仗打到现在,俄军可能是累了,需要休息一段时间才能重新大规模进攻了。现在在北线伊久姆,南线波帕斯纳俄军基本没有什么大的进展。而战斗最激烈的北顿涅茨克战场强度也唐山烧烤店打人绿衣男被曝拆迁户,岳母回应我们是村里的老实人6月14日,唐山烧烤店内打人事件已经经历了五天。目前事件更新,被打的四个女生,其中两人伤情比较严重,仍然在住院。据官方媒体报道,两位伤情比较严重的女生目前在华北理工大学附属医院,医唐山打人事件,主犯陈继志老婆出来说话了,说女儿在学校遭到歧视唐山打人事件主犯陈继志的老婆出来说话了。她说女儿在学校遭遇同学的歧视,同学不愿搭理她和她玩,都不敢上学了,天天哭!还有网友天天打电话,辱骂她。搞得家里鸡犬不宁,惶惶不可终日!简直是人社部拟发布18个新职业含家庭教育指导师等北京商报讯(记者程铭劼赵博宇)6月14日,据人社部官网消息,人社部对机器人工程技术人员等18个新职业信息进行公示,并拟将这一批新职业信息纳入新版中华人民共和国职业分类大典。具体来看真不给面子!足协高层公开撂挑子不干了,曾被球迷寄予厚望日前,根据国内媒体报道确认,63岁的中国足协技术总监克瑞斯将离开中国。此前他以身体及家庭原因为由,婉拒了中国足协的续约邀请。克瑞斯在中国足协任职三年半,对各级国字号队务提供了巨大的李存孝王彦章黄巢杨衮的武艺是怎么学来的?他们的师傅到底是谁?众多的英雄人物造就了残唐故事的精彩,黄巢凭着罗家枪的精妙成为了唐朝最后一任武状元杨衮的北霸六合枪挑战太原城,代师传枪的残唐第一枪高思继日挑三十六员唐将的王彦章,无敌于天下的李存孝名漫画结了婚才知道,谁能不偷腥呢?导语据相关的调查显示,在出轨的男人中,大约有80的人都会后悔。事实是这个样的吗?今天我们就一起来看看这三位在婚姻中出轨的男人,最真实的内心是什么样子的。在没有另一个她出现的时候,这刘雯细腰长腿身材超好,如何瘦出漫画腿?20min腿精课带你练今天被一个热搜甜到了,刘雯井柏然现身同一酒店。最近,有媒体拍到,两人先后入驻同一酒店,第二天刘雯独自离开回家,还有网友偶遇过两人一起骑车。吃瓜群众很欢乐想知道她俩姐弟恋吗,公开吧,资深调度员眼中的120悲剧提问方式需调整有人培训两周就上岗摘要6月3日,河南大学女生急性脑出血去世一事引发关注。她在宿舍独自挣扎了两个小时,直到室友回来发现异常,拨打120急救电话。而她的朋友和家人后来发现,君君曾努力求生呼救,自行拨打过老年人想要长寿,要多注意补充哪些营养?该不该服用保健品长寿是每一个老年朋友的愿望,为了使自己保持健康,延长自己的寿命,有很多老年人都付出了非常大的努力。体育锻炼保健品养生膳食,都是非常常见的保健手段。但是说起延年益寿,大家最先想到的还