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

SpringBoot2。X集成Swagger2开发API文档(在线离线)

  前言
  相信很多后端开发在项目中都会碰到要写 api 文档,不管是给前端、移动端等提供更好的对接,还是以后为了以后交接方便,都会要求写 api 文档。
  而手写 api 文档的话有诸多痛点:文档更新的时候,需要再次发送给对接人接口太多,手写文档很难管理接口返回的结果不明确不能直接在线测试接口,通常需要使用工具,如 postman 等
  Swagger 就很好地解决了这个问题。Swagger 简介
  Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 使用1.相关依赖                      io.springfox             springfox-swagger2             2.9.2                               io.springfox             springfox-swagger-ui             2.9.2           2.Swagger 配置类@Configuration @EnableSwagger2 public class SwaggerConfig {     @Bean     public Docket buildDocket() {         return new Docket(DocumentationType.SWAGGER_2)         .apiInfo(buildApiInf()) //将api的元信息设置为包含在json resourcelisting响应中         //.host("127.0.0.1:8080") //设置ip和端口,或者域名         .select()  //启动用于api选择的生成器         //.apis(RequestHandlerSelectors.any())         .apis(RequestHandlerSelectors.basePackage("cn.zwqh.springboot.controller"))//指定controller路径         .paths(PathSelectors.any()).build();     }      private ApiInfo buildApiInf() {          Contact contact=new Contact("朝雾轻寒","https://www.zwqh.top/","zwqh@clover1314.com");         return new ApiInfoBuilder()         .title("Swagger Demo Restful API Docs")//文档标题         .description("Swagger 示例 Restful Api 文档")//文档描述         .contact(contact)//联系人         .version("1.0")//版本号         //.license("")//更新此API的许可证信息         //.licenseUrl("")//更新此API的许可证Url         //.termsOfServiceUrl("")//更新服务条款URL         .build();      } } 3.Spring MVC 相关配置@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport {     /**      * 静态资源配置(默认)      */     @Override     public void addResourceHandlers(ResourceHandlerRegistry registry) {         registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");// 静态资源路径         registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");         registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");         super.addResourceHandlers(registry);     }  }
  如果不添加此静态资源配置会报错,找不到相关路径4.Model 中使用 Swagger 注解@ApiModel(value = "UserEntity", description = "用户对象") public class UserEntity implements Serializable{      /**      *       */     private static final long serialVersionUID = 5237730257103305078L;     @ApiModelProperty(value ="用户id",name="id",dataType="Long",required = false,example = "1",hidden = false )     private Long id;     @ApiModelProperty(value ="用户名",name="userName",dataType="String",required = false,example = "关羽" )     private String userName;     @ApiModelProperty(value ="用户性别",name="userSex",dataType="String",required = false,example = "男" )     private String userSex;      public Long getId() {         return id;     }      public void setId(Long id) {         this.id = id;     }      public String getUserName() {         return userName;     }      public void setUserName(String userName) {         this.userName = userName;     }      public String getUserSex() {         return userSex;     }      public void setUserSex(String userSex) {         this.userSex = userSex;     }  }  5. Controller 中使用 Swagger 注解 @RestController @RequestMapping("/api") @Api(tags = { "接口分组1", "接口分组2" }) public class ApiController {      @Autowired     private UserDao userDao;      @GetMapping("/getAllUser")     @ApiOperation(value = "获取所有用户", notes = "", httpMethod = "GET", tags = "接口分组3")     public List getAll() {         return userDao.getAll();     }      @GetMapping("/getUserById")     @ApiOperation(value = "根据id获取用户", notes = "id必传", httpMethod = "GET")     @ApiImplicitParam(name = "id", value = "用户id",example = "1", required = true, dataType = "long", paramType = "query")     public UserEntity getOne(Long id) {         return userDao.getOne(id);     }      @PostMapping("/getUserByNameAndSex")     @ApiOperation(value = "根据name和sex获取用户", notes = "", httpMethod = "POST")     @ApiImplicitParams({             @ApiImplicitParam(name = "userName", value = "用户名", example = "关羽", required = true, dataType = "string", paramType = "query"),             @ApiImplicitParam(name = "userSex", value = "用户性别", example = "男", required = true, dataType = "string", paramType = "query") })     public UserEntity getUserByNameAndSex(String userName, String userSex) {         return userDao.getUserByNameAndSex(userName, userSex);     }      @PostMapping("/insertUser")     @ApiOperation(value = "新增用户", notes = "传json,数据放body", httpMethod = "POST")     @ApiImplicitParams({             @ApiImplicitParam(name = "body", value = "用户对象json", example = "{userName:"朝雾轻寒",userSex:"男"}", required = true) })     public String insertUser(@RequestBody String body) {         System.out.println(body);         UserEntity user = JSON.parseObject(body, UserEntity.class);         userDao.insertUser(user);         return "{code:0,msg:"success"}";     }      @PostMapping("/updateUser")     @ApiOperation(value = "修改用户", notes = "传json,数据放body", httpMethod = "POST")     @ApiImplicitParams({             @ApiImplicitParam(name = "body", value = "用户对象json", example = "{id:23,userName:"朝雾轻寒",userSex:"女"}", required = true) })     public String updateUser(@RequestBody String body) {         System.out.println(body);         UserEntity user = JSON.parseObject(body, UserEntity.class);         userDao.updateUser(user);         return "{code:0,msg:"success"}";     }      @PostMapping("/deleteUser")     @ApiOperation(value = "删除用户", notes = "id必传", httpMethod = "POST")     public String deleteUser(@ApiParam(name = "id", value = "用户id", required = true) Long id) {         userDao.deleteUser(id);         return "{code:0,msg:"success"}";     } } 5.测试
  访问 http://127.0.0.1:8080/swagger-ui.html 进行接口在线测试Swagger 常用注解1.@Api
  用于类,表示表示这个类是swagger的资源。属性如下:tags 表示说明,tags如果有多个值,会生成多个列表value 表示说明,可以使用tags替代2.@ApiOperation
  用于方法,表示一个http请求的操作。属性如下:value 用于方法描述notes 用于提示内容tags 用于API文档控制的标记列表,视情况而用,可以进行独立分组3.@ApiParam
  用于方法、参数、字段说明;表示对参数的添加元数据。name 参数名value 参数说明required 是否必填4.@ApiModel
  用于类,表示对类进行说明,用于参数用实体类接受。value 对象名description 描述5.@ApiModelProperty
  用于方法、字段,表示对model属性的说明或者数据操作更改。value 字段说明name 重写属性名dataType 重写属性数据类型required 是否必填example 举例说明hidden 隐藏6.@ApiIgnore
  用于类、方法、方法参数,表示这个方法或者类被忽略,不在swagger-ui.html上显示。7.@ApiImplicitParam
  用于方法,表示单独的请求参数。name 参数名value 参数说明dataType 数据类型paramType 参数类型example 举例说明8.@ApiImplicitParams
  用于方法,包含多个 @ApiImplicitParam。9.@ApiResponses @ApiResponse
  用于类或者方法,描述操作的可能响应。code 响应的HTTP状态代码message 响应附带的可读消息10.@ResponseHeader
  用于方法,响应头设置。name 响应头名称description 头描述response 默认响应类 voidresponseContainer 参考ApiOperation中配置Swagger 导出离线 api 文档1.导出 AsciiDocs、Markdown、Confluence 格式文档
  添加依赖                      io.github.swagger2markup             swagger2markup             1.3.3         
  转换工具类public class SwaggerUtils {      private static final String url = "http://127.0.0.1:8080/v2/api-docs";     /**      * 生成AsciiDocs格式文档      * @throws MalformedURLException      */     public static void generateAsciiDocs() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.ASCIIDOC)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema().build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFolder(Paths.get("./docs/asciidoc/generated"));     }     /**      * 生成AsciiDocs格式文档,并汇总成一个文件      * @throws MalformedURLException      */     public static void generateAsciiDocsToFile() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.ASCIIDOC)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema()                 .build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFile(Paths.get("./docs/asciidoc/generated/all"));     }      /**      * 生成Markdown格式文档      * @throws MalformedURLException      */     public static void generateMarkdownDocs() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.MARKDOWN)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema()                 .build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFolder(Paths.get("./docs/markdown/generated"));     }     /**      * 生成Markdown格式文档,并汇总成一个文件      * @throws MalformedURLException      */     public static void generateMarkdownDocsToFile() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.MARKDOWN)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema()                 .build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFile(Paths.get("./docs/markdown/generated/all"));     }      /**      * 生成Confluence格式文档      * @throws MalformedURLException      */     public static void generateConfluenceDocs() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema()                 .build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFolder(Paths.get("./docs/confluence/generated"));     }      /**      * 生成Confluence格式文档,并汇总成一个文件      * @throws MalformedURLException      */     public static void generateConfluenceDocsToFile() throws MalformedURLException {         Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder()                 .withMarkupLanguage(MarkupLanguage.CONFLUENCE_MARKUP)                 .withOutputLanguage(Language.ZH)                 .withPathsGroupedBy(GroupBy.TAGS)                 .withGeneratedExamples()                 .withoutInlineSchema()                 .build();          Swagger2MarkupConverter.from(new URL(url))                 .withConfig(config)                 .build()                 .toFile(Paths.get("./docs/confluence/generated/all"));     }  }
  使用测试 Controller@RestController @RequestMapping("/export") @ApiIgnore public class ExportController {      @RequestMapping("/ascii")     public String exportAscii() throws MalformedURLException{         SwaggerUtils.generateAsciiDocs();         return "success";     }      @RequestMapping("/asciiToFile")     public String asciiToFile() throws MalformedURLException{         SwaggerUtils.generateAsciiDocsToFile();         return "success";     }      @RequestMapping("/markdown")     public String exportMarkdown() throws MalformedURLException{         SwaggerUtils.generateMarkdownDocs();         return "success";     }      @RequestMapping("/markdownToFile")     public String exportMarkdownToFile() throws MalformedURLException{         SwaggerUtils.generateMarkdownDocsToFile();         return "success";     }      @RequestMapping("/confluence")     public String confluence() throws MalformedURLException{         SwaggerUtils.generateConfluenceDocs();         return "success";     }      @RequestMapping("/confluenceToFile")     public String confluenceToFile() throws MalformedURLException{         SwaggerUtils.generateConfluenceDocsToFile();         return "success";     } }  2.导出 html、pdf、xml 格式
  添加依赖                      org.springframework.restdocs             spring-restdocs-mockmvc             test                                        io.springfox             springfox-staticdocs             2.6.1                                                                      org.springframework.boot                     spring-boot-maven-plugin                                                       io.github.swagger2markup                     swagger2markup-maven-plugin                     1.3.1                                              http://127.0.0.1:8080/v2/api-docs                         ./docs/asciidoc/generated                                                      ASCIIDOC                                                                                                     org.asciidoctor                     asciidoctor-maven-plugin                     1.5.3                                                                                                                     org.asciidoctor                             asciidoctorj-pdf                             1.5.0-alpha.10.1                                                                               org.jruby                             jruby-complete                             1.7.21                                                                                            ./docs/asciidoc/generated                         ./docs/asciidoc/html                          html                                                  true                          book                          coderay                                                                                   left                                                          3                                                          true                                                                                                               
  可以修改此处 html 和 pdf,通过 mvn asciidoctor:process-asciidoc 可以导出相应格式文件./docs/asciidoc/html                          html
  执行 mvn asciidoctor:process-asciidoc 后再执行 mvn generate-resources,可在 targt/generated-docs 目录下生成 xml 格式文件

想省心就别省钱,2022年这三款旗舰手机值得入手,轻松用到2025年买手机如果预算足够的花,非常建议大家一步到位。对于普通的消费品来说,手机属于价格较高的那类,如果想用回本,那在一开始的时候就不要想着省钱。今天要和大家聊的三款旗舰手机,贵是贵了点,微信可以显示手机温度了,自带置顶浮窗想不到吧,微信居然还能充当手机温度监控器。最近有网友发现,自从微信更新后,悄悄上线了新功能,可以用来监控手机的实时温度。这个功能比较隐蔽,想要调出该功能,需要打开微信我设置,点击帮微信又有新功能上线支持手机温度监控Tech星球5月7日消息,4月底,微信推送了安卓8。0。22正式版,带来了存储空间优化历史铃声查询搜索界面改版等新功能。不过,据IT之家,有网友发现,微信升级8。0。22版本后,还北京共享单车骑行量大增微信支持手机温度监控上海高考延期北京共享单车骑行量大增微信支持手机温度监控上海高考确认延期蜜雪冰城因咖啡粉过期被罚亚奥理事会决定杭州亚运会延期举行并取消汕头亚洲青年运动会苹果谷歌微软将联合推广无密码登录技术支付宝一加Ace第一天使用就烫手?用户不必惊慌,温度在正常范围内玩游戏烫手就要退货?不懂手机确实可能不太理解,但一加Ace这款产品的散热做得不错。天气热了,玩游戏都会发烫,所以大家不必过度惊慌。尽管现在智能手机已经非常普及了,但是真正了解这个行微信又有新功能上线支持手机温度监控Tech星球5月7日消息,4月底,微信推送了安卓8。0。22正式版,带来了存储空间优化历史铃声查询搜索界面改版等新功能。不过,据IT之家,有网友发现,微信升级8。0。22版本后,还微信支持手机温度监控4月底,微信推送了安卓8。0。22正式版,带来了存储空间优化历史铃声查询搜索界面改版等新功能。不过,据IT之家报道,有网友发现,微信升级8。0。22版本后,还增加了手机温度监控帧数互联网平台会员制频繁割韭菜无论是零售外卖或是出行文化等领域,疫情加速了线上消费的渗透,流量决定互联网平台的生死。对于互联网平台来说,不仅要拉升反映用户规模与消费潜力的月活日活,付费会员也是他们大力扩张的重点蔡司专业影像自研芯片V14nm工艺,vivoX80Pro能称王称霸?近段时间,vivo炸出了很多好货。其中一款高端全能旗舰手机vivoX80Pro,简直就是王炸中的王炸!其各项绝顶的配置和性能一个接一个地霸屏了,其它手机只能自愧不如地靠边站。当然这这些专利都是苹果已经申请过的从14年就开始被传要造车的苹果,在这些年间,为苹果申请了多少专利,一起来看看。1夜间识别力增强,全车传感器联动夜间,传统汽车头灯的亮度覆盖范围有限,车灯路灯以及其他光源混合在一起使初二初三的孩子应不应该给买手机?初二初三的孩子,就应该给他们买手机。现在的吃喝日常,哪个地方都要用到手机,这个年纪再不用手机,简直要OUT了。孩子用手机,不一定是一件不好的事,自律的孩子,会把手机当作学习的工具,
新版红绿灯实施取消读秒功能,左转直行右转受影响目前,汽车正处于快速转型期,传统燃油汽车终有一天会退出历史发展的舞台,新能源电动汽车发展势头很猛,销量和口碑稳步提高。为何购买新能源电动汽车?除了挂牌方便有补贴之外,多数车主考虑到阿里财报阿里确实焦虑了2021年,对于阿里来说是艰难的一年。营收增长放缓,净利润增速腰斩,基本盘淘系电商增速跌至个位数,而本地生活国际业务云计算数字媒体业务不仅挑不起大梁,反而拖累了整体盈利能力。2月2血糖仪多少钱一台?什么价位的血糖仪好?买个进口的选什么价位我觉得应该血糖仪测试准不准,再高的价位血糖仪不准也没啥意思。我2021年7月份查血糖高,朋友推荐买了一台罗氏卓越金采血糖仪,测量值还是比较准确的,这是我几次去医众安保险联合阿里健康推出癫痫保医疗险黄一灵中国证券报中证网中证网讯(记者黄一灵)近日,众安保险联合阿里健康推出为癫痫人群定制的医疗险癫痫保,为癫痫患者提供一体化的健康管理和保障服务。在我国,癫痫已成为常见慢性神经系统注意!这9款App违规搜集个人信息,你家孩子可能也在用据海南日报客户端丨记者蔡曼良尤梦瑜近日,蜀门蚁族崛起等9款App因存在不同程度违法违规收集使用个人信息及泄露未成年人隐私的行为,海南省委网信办依据相关法律和有关规定,对这9款App从奇形怪状到神似遥控器,再到可语音聊天,手柄到底经历了什么?在超任重新定义了游戏控制器的四年后,当时专注于音响设备的SONY,终于也以一鸣惊人的Playstation主机加入了战局。而它所使用的大容量CD光碟,更是为游戏业界投下了一颗震撼弹国内外科技巨头怎么了?紧盯中国地区不放,纷纷将服务器放在贵州对于互联网行业而言,服务器可能是最核心的存在,因为任何数据和成果,都需要基于服务器之上。这就导致每一个互联网公司或者说科技巨头,都拥有大量服务器,可是如何归置服务器也成为一大难题。超好用的Vue图片懒加载库VueLazyload前沿应用开发中图片的加载是比较耗资源的,处理不好,就会影响应用的加载速度,导致用户体验比较差劲今天给大家介绍一个Vue的图片懒加载库VueLazyload,这个库的几个优势在于图片2022年了,价格仅2799元的OPPOReno6还值得买吗?OPPOReno6于2021年5月推出,是OPPO高端细分市场中的一款手机,因其产品功能不逊色于高端市场的智能手机,因此受到很多人的青睐。而且当我查看更新机型OPPOReno7的相2022年还在使用iPhoneSE2是什么体验?iPhoneSE2发布于2020年四月份,可以说这是一台库克为了清理库存而发布的一款手机。外观与iPhone8几乎相似,唯一的不同便是将logo移动至中间的位置,并且全系都是黑面板美女产品经理确认小米12没有青春版,Civi网传图片有误小米于去年9月份开辟Civi系列产品,主打高颜值女性市场产品,号称旗下有史以来最好看的手机。今年12月Civi产品经理魏思琪升任小米数字系列主管,新任美女产品经理胡馨心时常与网友交