Spring Boot整合swagger2

news2024/9/23 19:14:58

在上一篇中我们围绕了Spring Boot 集成了RESTful API项目,但是我们在实际开发中,我们的一个RESTful API有可能就要服务多个不同的开发人员或者开发团队,包括不限于PC,安卓,IOS,甚至现在的鸿蒙OS,web开发等等。为了减少与其他团队平时开发期间的频繁沟通成本,我们一般会选择创建一个相关的文档来记录所有的接口细节,也就是我们常常在实际开发中的接口文档。

  • 但是我们采用接口文档进行记录的时候,发现,由于接口众多,并且他们的细节比较复杂,需要我们考虑不同场景的HTTP请求,甚至HTTP的相关头部信息,内容等,并且我们在创建这样的接口文档的时候,费时费力,很多的时候,我们都统计不全,甚至还会出现错误,这是因为人力统计的时候很容易出现差错,这也很正常。
  • 并且随着时间的增加,我们对系统进行改动,不免也会对相关接口进行改动,这个只要是做过开发的都知道,这里调接口,那里调接口,我们就需要对文档进行修改,但是我们在开发过程中,发现代码和文档处于两个阶级,除非老大有严格的管控,不然就会造成很多问题。

这个时候,我们发现刚好有一种技术可以解决我们的问题,也就是Swagger2,他可以轻松的整合到Spring Boot中,并于Spring MVC 程序配合组织处很强大哦的RESTful API文档,极大的减少了我们创建文档的工作量,同时进一步将内容整合到我们的实现代码中,让代码修改和文档维护成为一体,同时修改,同时记录,让我们在修改代码的同时也修改了文档说明。

此外Swagger2 提供了强大的页面测试功能来调试每个RESTful API。具体效果如下图所示。
在这里插入图片描述

准备工作

我们需要有一个Spring Boot 实现的RESTful API工程,我们在上一篇就以及涉及到了,如果你没有接触过RESTful API,欢迎参照上一篇一起食用更佳。

Spring Boot整合Swagger 2

第一步,添加依赖,老样子,这里就不在详细描述了,如下:

<dependencies>
    <!-- Spring Boot Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Springfox Swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version> <!-- 请使用最新版本 -->
    </dependency>

    <!-- Springfox Swagger UI -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version> <!-- 请使用最新版本 -->
    </dependency>
</dependencies>

第二步:在Spring Boot的启动类中添加一个@EnableSwagger2Doc 注解,如下:

@EnableSwagger2Doc
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

第三步创建一个User实体对象,并给相关实体添加Swagger2 自带的接口,@ApiModel添加到实体类上,@ApiModelProperty添加到具体的属性之上,用于描述具体属性

@ApiModel(description="用户实体")
public class User {

    @ApiModelProperty("用户编号")
    private Long id;
    @ApiModelProperty("用户姓名")
    private String name;
    @ApiModelProperty("用户年龄")
    private Integer age;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

第四步,我们在application.properties文件上配置有关Swagger2的相关属性。

swagger.title=spring-boot-starter-swagger
swagger.description=Starter for swagger 2.x
swagger.version=1.9.0.RELEASE
swagger.license=Apache License, Version 2.0
swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html
swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger
swagger.contact.name=miaow
swagger.contact.url=https://luoxiaohei520.github.io
swagger.contact.email=miaow@qq.com
swagger.base-package=com.miaow
swagger.base-path=/**

其中参数的相关含义如下:

swagger.title:标题
swagger.description:描述
swagger.version:版本
swagger.license:许可证
swagger.licenseUrl:许可证URL
swagger.termsOfServiceUrl:服务条款URL
swagger.contact.name:维护人
swagger.contact.url:维护人URL
swagger.contact.email:维护人email
swagger.base-package:swagger扫描的基础包,默认:全扫描
swagger.base-path:需要处理的基础URL规则,默认:/**

更多配置请参照官方文档

此时启动项目,访问链接: http://localhost:8080/swagger-ui.html
发现页面全是英文的。

第五步,我们来对Controller层的相关对象和方法进行API注解说明,在第四步我们发现通过浏览器访问,整个界面都是英文或者遵循代码定义的名称产生的,对用户并不友好,于是我们通过相关注解来给API增加说明:@Api@ApiOperation注解来给API增加说明、通过@ApiImplicitParam@ApiModel@ApiModelProperty注解来给参数增加说明。

@Api(tags = "用户管理")
@RestController
@RequestMapping(value = "/users")     // 通过这里配置使下面的映射都在/users下
public class UserController {

    // 创建线程安全的Map,模拟users信息的存储
    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<>());

    @GetMapping("/")
    @ApiOperation(value = "获取用户列表")
    public List<User> getUserList() {
        List<User> r = new ArrayList<>(users.values());
        return r;
    }

    @PostMapping("/")
    @ApiOperation(value = "创建用户", notes = "根据User对象创建用户")
    public String postUser(@RequestBody User user) {
        users.put(user.getId(), user);
        return "success";
    }

    @GetMapping("/{id}")
    @ApiOperation(value = "获取用户详细信息", notes = "根据url的id来获取用户详细信息")
    public User getUser(@PathVariable Long id) {
        return users.get(id);
    }

    @PutMapping("/{id}")
    @ApiImplicitParam(paramType = "path", dataType = "Long", name = "id", value = "用户编号", required = true, example = "1")
    @ApiOperation(value = "更新用户详细信息", notes = "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
    public String putUser(@PathVariable Long id, @RequestBody User user) {
        User u = users.get(id);
        u.setName(user.getName());
        u.setAge(user.getAge());
        users.put(id, u);
        return "success";
    }

    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除用户", notes = "根据url的id来指定删除对象")
    public String deleteUser(@PathVariable Long id) {
        users.remove(id);
        return "success";
    }
}

之后再通过:http://localhost:8080/swagger-ui.html 访问,点击相关信息,可以看到具体的参数和相关属性。
还可以相关提示进行测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在上图请求的页面中,我们看到user的Value是个输入框,是的,Swagger除了查看接口功能外,还提供了调试测试功能,我们可以点击上图中右侧的Model Schema(黄色区域:它指明了User的数据结构),此时Value中就有了user对象的模板,我们只需要稍适修改,点击下方“Try it out!”按钮,即可完成了一次请求调用!

此时,你也可以通过几个GET请求来验证之前的POST请求是否正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buuctf_练[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 文章目录 [网鼎杯 2018]Fakebook掌握知识解题思路关键paylaod 掌握知识 ​ SQL注入的联合注入&#xff1b;闭合类型的探查&#xff0c;本次是数字型闭合&#xff1b;SQL注入的读取文件的利用 解题思路 打开题目链接&#xff0c;发现主界面给了一些信息…

大数据-Storm流式框架(一)

一、storm介绍 Storm是个实时的、分布式以及具备高容错的计算系统 Storm进程常驻内存&#xff08;worker&#xff0c;supervisor&#xff0c;nimbus&#xff0c;ui&#xff0c;logviewer。。。&#xff09;Storm数据不经过磁盘&#xff0c;在内存中处理Twitter开源的分布式实时…

CSS基础框盒模型:打造炙手可热的网页布局!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、是…

老师们都在用的办公好物

现在还有老师不知道班级查询系统吗?各位老师们&#xff0c;向大家推荐一款超级实用的班级查询系统&#xff0c;帮你轻松管理学生信息&#xff0c;省去繁琐的手动操作&#xff0c;还能让学生们自主查询&#xff0c;简直是老师的福音&#xff01; 如果你在编程方面感到有些吃力&…

vscode推送gitee方法

有一套uni-app代码需要修改&#xff0c;版本控制使用vscode的git功能&#xff0c;远程库在gitee上。 1、设置vscode中git.exe路径 由于git使用了绿色便携版&#xff08;PortableGit-2.42.0.2-64-bit.7z.exe&#xff09;&#xff0c;vscode未识别到git安装路径&#xff0c;需要…

RTE2023大会来袭,声网宣布首创广播级4K超高清实时互动体验

10月24日&#xff0c;由声网和RTE开发者社区联合主办的RTE2023第九届实时互联网大会在北京举办&#xff0c;声网与众多RTE领域技术专家、产品精英、创业者、开发者一起&#xff0c;共同开启了以“智能高清”为主题的全新探讨。本届RTE大会将持续2天&#xff0c;开展1场主论坛及…

【路径规划】A*算法 Java实现

A*&#xff08;A-Star&#xff09;算法是一种广泛使用的寻路算法&#xff0c;尤其在计算机科学和人工智能领域。 算法思想 通过评估函数来引导搜索过程&#xff0c;从而找到从起始点到目标点的最短路径。评估函数通常包括两部分&#xff1a;一部分是已经走过的实际距离&#x…

「我在淘天做技术」双 11 背后的营销技术体系

作者&#xff1a;朱咏杰(小枫) 近期淘天集团秋季 2024 届校园招聘正式启动&#xff0c;预计将发放 2000 多个 offer&#xff0c;其中技术类岗位占比超过 50%。为了方便大家更真实地了解淘天技术的布局和现状&#xff0c;我们策划了「我在淘天做技术」系列&#xff0c;首次全面分…

科技资讯|苹果穿戴新专利,表带、服装等织物可变身柔性屏幕或扬声器

根据美国商标和专利局&#xff08;USPTO&#xff09;本周公示的清单&#xff0c;苹果公司获得了一项新的技术专利&#xff0c;可以在 Apple Watch 表带、服装等物品上&#xff0c;引入基于织物的柔性扬声器。 根据专利描述&#xff0c;通过在织物中嵌入声学组件&#xff08;例…

Makefile总结

一、Makefile用法及变量&#xff08;自定义变量、自动变量、隐含变量&#xff09; 一、Makefile的重要性 1、编译文件 2、正常编译&#xff0c;文件多的时候操作麻烦 3、决定能不能完成大型工程 二、Makefile的概述 1、自动化编译-makefile 编译效率&#xff1a;make编译…

01.MySQL(SQL分类及使用)

注意&#xff1a;DML只是进行增删改&#xff0c;DQL才有查询 分类全称说明DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来…

vue3的getCurrentInstance获取组件实例踩坑记录

一、getCurrentInstance基本用法 我们可以通过 getCurrentInstance这个函数来返回当前组件的实例对象,也就是当前vue这个实例对象 Vue2中&#xff0c;可以通过this来获取当前组件实例&#xff1b; Vue3中&#xff0c;在setup中无法通过this获取组件实例&#xff0c;console.lo…

ElasticSearch中关于Nasted嵌套查询的介绍:生动案例,通俗易懂,彻底吸收

题注&#xff1a;随着对ES接触的越来越深入&#xff0c;发现此前了解的ES知识点有点单薄&#xff0c;特此寻来ES知识点汇总成的一个思维导图&#xff0c;全面了解自己掌握了哪些&#xff0c;未掌握哪些。此外&#xff0c;作者斌并没有足够的精力学习ES全部的知识点&#xff0c;…

1024程序员节,飞桨星河社区开发者们一起闯关升级、玩转Prompt应用赢大奖~

1024&#xff0c;是属于每一位程序员/程序媛的节日~ 今年&#xff0c;飞桨给星河社区的开发者们也准备了“超级码力 碰撞未来”系列活动&#xff0c;和大家沉浸式玩转闯关冒险。 冲榜单 零代码打造爆款Prompt应用 飞桨AI Studio星河社区上线新版文心一言专区&#xff0c;帮助…

代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果 文章链接&#xff1a;K次取反后最大化的数组和 加油站 分发糖果 视频链接&#xff1a;K次取反后最大化的数组和 加油站 分发糖果 目录 代…

STM TIM(二)输出比较

STM TIM&#xff08;二&#xff09;输出比较 输出比较简介 OC&#xff08;Output Compare&#xff09;输出比较 输出比较可以通过比较CNT&#xff08;CNT计数器&#xff09;与CCR寄存器&#xff08;捕获/比较寄存器&#xff09;值的关系&#xff0c;来对输出电平进行置1、置0…

Camtasia2024中文免费版电脑录屏软件

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

如何理解Go言中的Context?

目前看过除了《go语言程序设计》以外最好的教程&#xff1a;https://www.practical-go-lessons.com 原文&#xff1a;https://www.practical-go-lessons.com/chap-37-context 你将在本章中学到什么&#xff1f; 1.什么是上下文&#xff1f; 2.什么是链表&#xff1f; 3.如何…

DAOS学习笔记及思考

DAOS带来的思考 根据daos docs的描述&#xff0c;DAOS是Intel基于NVMe全新设计开发并开源的异步对象存储&#xff0c;充分利用下一代NVMe技术的优势&#xff0c;对外提供KV存储接口&#xff0c;提供非阻塞事物I/O&#xff0c;端到端完整性&#xff0c;细粒度的数据控制&#x…