当前位置: 首页 > news >正文

Spring Boot中使用Swagger

1. 启用Swagger
1.1 启用注解扫描和文档接口

直接在POM文件引入依赖

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>
1.2 启动swagger-ui

目前看到的选项有2个:

  • swaager-ui ,访问地址: http://127.0.0.1:18080/swagger-ui.html
    <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency>
  • swagger-bootstrap-ui ,也叫knife4j ,访问地址: http://127.0.0.1:18080/doc.html
    <dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>${lastVersion}</version></dependency>

我更喜欢swagger-bootstrap-ui的风格

1.3 创建Swagger配置类
    @Configuration@EnableSwagger2public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()//                .apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.dwpro")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("标题lws") //标题.description("简介lws") //简介.termsOfServiceUrl("服务条款lws") //服务条款.contact(new Contact("randy", "", "randy@gmail.com")).version("1.0.lws") //版本.build();}}

在这里插入图片描述

2. 注解
2.1 @Api

@Api注解在Controller上,通过tags指定指定名称(左侧菜单的名称),tags可以指定多个值,多种使用场景通过指定相同的tag值将所有的API分组在一起。

@Api还有valuedescription属性,description已经@Deprecatedvalue号称会被当成tags值,实际测试下来无效

    @RestController@RequestMapping("/v1")@Api(tags = {"测试Swagger的注解使用"})public class HelloworldController {}

在这里插入图片描述

2.2 @ApiOperation

@ApiOperation用于注解到Controller上的方法,对应一个对外提供的接口。目前有4个属性:

属性描述
value对操作的简单说明
notes对操作的详细说明
httpMethodHTTP请求类型,可选:GET HEAD POST PUT DELETE OPTIONS PATCH
codeHTTP状态码,默认为200
produces输出的Content-Type
consumes输入的Content-Type

示例

    @RequestMapping("say")@ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")public String say(@RequestParam("message") String message) {return message;}

在这里插入图片描述

2.3 @ApiParam
属性描述
name参数名称,因此这个一般应该是字母
value参数说明
defaultValue参数默认值
required参数是否必须

参数类型会通过反射获取,如果参数是基本类型会显示在数据类型字段,如果参数是自定义的类,会同时显示在数据类型schema字段

2.3.1 示例: query param

基本上只有value字段对接收说明有意义, example字段是在页面上调试给的示例值

@RequestMapping("say")
@ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")
public String say(@ApiParam(value = "参数描述", example = "10086") @RequestParam("message") Integer message) {return "";
}

在这里插入图片描述

2.3.2 示例: 使用请求体,并用一个对象接收参数

使用@RequestBody的场景下,指定@ApiParam唯一有用的属性的value,指定其他参数没有效果

    @PostMapping("say2")@ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")public String say2(@ApiParam(value = "参数描述") @RequestBody ApFissionLog apFissionLog) {return "";}

在这里插入图片描述

2.4 @ApiImplicitParams 和 @ApiImplicitParam

@ApiParam相同作用,但是不把注解混合到代码内部,可读性更强,个人更喜欢这种方式

    @PostMapping("say3")@ApiImplicitParams({@ApiImplicitParam(name = "cavatar",value = "value1",example = "10001", dataType = "int", paramType = "query"),@ApiImplicitParam(name = "cnickname",value = "value2",example = "example2", dataType = "string", paramType = "query")})public String say3(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return "";}

在这里插入图片描述

2.5 @ApiResponse

定义接口的返回值,示例中say4say5方法的表现基本一致,没发现注解的特殊意义

属性描述
codeHTTP状态码
message状态码的文本描述
response返回值的class
responseContainer返回容器类型时使用,有效值: List Set Map
    @PostMapping("say4")public ApFissionLog say4(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return new ApFissionLog();}@PostMapping("say5")@ApiResponse(code = 200,message = "返回描述", response = ApFissionLog.class)public ApFissionLog say5(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return new ApFissionLog();}
2.6 @ApiModel和@ApiModelProperty

当请求和响应是POJO的时候特别有用,现实场景中这又是最常用的情况。

@ApiModel用于指定POJO类的描述,提供更可读的类型名称(这个个人觉得没用,直接展示现有类名挺好)。

属性描述
valuemodel的别名,默认为类名
descriptionmodel的详细描述

@ApiModelProperty用于描述POJO里的字段

属性描述
value属性简短描述
example属性的示例值
required是否为必须值
    @PostMapping("say6")@ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")public ApFissionLog say6(@RequestBody ApFissionLog apFissionLog) {return new ApFissionLog();}

通过在ApFissionLog类上添加注解


@ApiModel(value = "model类名字", description = "描述信息")
public class ApFissionLog {@ApiModelProperty(value = "C用户的昵称", notes = "notes", example = "AAA-BBB-CCC", required = true)private String cnickname;@ApiModelProperty(value = "C用户的头像", notes = "notes", example = "http://www.aaa.com/avtar.png", required = true)private String cavatar;}

在这里插入图片描述

3. API分组

通过在Swagger的配置类里创建两个Docket对象,扫描不同的包就能完成分组

@Configuration
@EnableSwagger2
public class SwaggerConfig {@Bean("defaultApi")public Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("分组1").select()
//                .apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.dwpro")).paths(PathSelectors.any()).build();}@Bean("groupApi")public Docket createGroupApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("分组2").select()
//                .apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.dwpro")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("标题lws") //标题.description("简介lws") //简介.termsOfServiceUrl("服务条款lws") //服务条款.contact(new Contact("randy", "", "randy@gmail.com")).version("1.0.lws") //版本.build();}
}

在这里插入图片描述

4. 完整示例
4.1 pom.xml 添加依赖
    <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency>
4.2 Swagger Config 类
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Bean("defaultApi")public Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("分组1").select()
//                .apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.dwpro")).paths(PathSelectors.any()).build();}@Bean("groupApi")public Docket createGroupApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).groupName("分组2").select()
//                .apis(RequestHandlerSelectors.any()).apis(RequestHandlerSelectors.basePackage("com.dwpro")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("标题lws") //标题.description("简介lws") //简介.termsOfServiceUrl("服务条款lws") //服务条款.contact(new Contact("randy", "", "randy@gmail.com")).version("1.0.lws") //版本.build();}
}
4.3 Controller类
    @RestController@RequestMapping("/v1")@Api(tags = {"测试Swagger的注解使用"})public class HelloworldController {@RequestMapping("say1")@ApiOperation(value = "用于打印用户输入信息", notes = "这是个什么鬼啊啊啊", httpMethod = "GET")public String say1(@ApiParam(value = "参数描述", example = "10086") @RequestParam("message") Integer message) {return "";}@PostMapping("say2")@ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")public String say2(@ApiParam(value = "参数描述") @RequestBody ApFissionLog apFissionLog) {return "";}@PostMapping("say3")@ApiImplicitParams({@ApiImplicitParam(name = "cavatar",value = "value1",example = "10001", dataType = "int", paramType = "query"),@ApiImplicitParam(name = "cnickname",value = "value2",example = "example2", dataType = "string", paramType = "query")})public String say3(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return "";}@PostMapping("say4")public ApFissionLog say4(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return new ApFissionLog();}@PostMapping("say5")@ApiResponse(code = 200,message = "返回描述", response = ApFissionLog.class)public ApFissionLog say5(@RequestParam("cavatar") String cavatar, @RequestParam("cnickname") String cnickname) {return new ApFissionLog();}@PostMapping("say6")@ApiOperation(value = "测试请求体", notes = "这是个什么鬼啊啊啊", httpMethod = "POST")public ApFissionLog say6(@RequestBody ApFissionLog apFissionLog) {return new ApFissionLog();}}
4.4 POJO类
    @Data@ApiModel(value = "model类名字", description = "描述信息")public class ApFissionLog {@ApiModelProperty(value = "C用户的昵称", notes = "notes", example = "AAA-BBB-CCC", required = true)private String cnickname;@ApiModelProperty(value = "C用户的头像", notes = "notes", example = "http://www.aaa.com/avtar.png", required = true)private String cavatar;}

相关文章:

Spring Boot中使用Swagger

1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…...

uniapp实战 —— 竖排多级分类展示

效果预览 完整范例代码 页面 src\pages\category\category.vue <script setup lang"ts"> import { getCategoryTopAPI } from /apis/category import type { CategoryTopItem } from /types/category import { onLoad } from dcloudio/uni-app import { compu…...

SAP UI5 walkthrough step6 Modules

在SAPUI5 中&#xff0c;资源通常用作Modules&#xff0c;这个我们将用Message Toast 来实现告警功能 修改controller.js webapp/controller/App.controller.js sap.ui.define(["sap/ui/core/mvc/Controller","sap/m/MessageToast" ], (Controller, Mes…...

时间相关类

内容 JDK7时间相关类JDK8时间相关类 第一章 Date类 1.1 Date概述 java.util.Date类 表示特定的瞬间&#xff0c;精确到毫秒。 继续查阅Date类的描述&#xff0c;发现Date拥有多个构造函数&#xff0c;只是部分已经过时&#xff0c;我们重点看以下两个构造函数 public Dat…...

数据库事务:保障数据一致性的基石

目录 1. 什么是数据库事务&#xff1f; 1.1 ACID特性解析 2. 事务的实现与控制 2.1 事务的开始和结束 2.2 事务的隔离级别 3. 并发控制与事务管理 3.1 并发控制的挑战 3.2 锁和并发控制算法 4. 最佳实践与性能优化 4.1 事务的划分 4.2 批处理操作 5. 事务的未来发展…...

自动化操作脚本

文章目录 vbsopenCV pyautogui vbs SSH连接并执行指令操作 Dim WshShell Set WshShellWScript.CreateObject("WScript.Shell") WshShell.Run "cmd.exe" WScript.Sleep 1000 WshShell.SendKeys "ssh xcmg10.27.40.103" WshShell.SendKeys &qu…...

MVC、MVP、MVVM模式的区别

前言&#xff1a;这三个表现层框架设计模式是依次进化而形成MVC—>MVP—>MVVM。在以前传统的开发模式当中即MVC模式&#xff0c;前端人员只负责Model&#xff08;数据库&#xff09;、 View&#xff08;视图&#xff09;和 Controller /Presenter/ViewModel&#xff08;控…...

【Vue】日常错误总结(持续更新)

日常遇到的小问题汇总, 内容小篇幅少的就全放这里了, 内容多的会在Vue专栏单独分享~ 目录 【Q】 el-form-item值为 null 或 undefined显示““ 【Q】dialog内组件数据刷新总是延迟慢一拍 问题背景描述 解决方案 代码简单模拟 JS 【Q】el-input 不能输入的解决办法 方法…...

java多线程(常用方法、实现方式、线程安全问题、生命周期、线程池)

多线程相关的三组概念 程序和进程 程序&#xff08;program&#xff09;&#xff1a;一个固定的运行逻辑和数据的集合&#xff0c;是一个静态的状态&#xff0c;一般存储在硬盘中。简单来说就是我们编写的代码 进程&#xff08;process&#xff09;&#xff1a;一个正在运行的…...

Day05 linux高级系统设计 - 管道

复制文件描述符 dup函数 作用&#xff1a; 文件描述符复制 语法&#xff1a; #include <unistd.h> int dup (int oldfd); 参数&#xff1a; 所需复制得文件描述符 返回值&#xff1a; 复制到的文件描述符 功能&#xff1a; 从文件描述符表中&#xff0c;找一个最小…...

低代码:美味膳食或垃圾食品?

一、什么是低代码 低代码是一种开发方法&#xff0c;通过可视化界面和少量的编码&#xff0c;使开发者能够快速构建应用程序。它的目标是提高开发效率、降低开发成本&#xff0c;并支持快速迭代和敏捷开发。 二、低代码的优缺点 低代码开发具有以下优点&#xff1a; 快速开…...

免费网页抓取工具大全【附下载和工具使用教程】

在当今信息爆炸的时代&#xff0c;获取准确而丰富的数据对于企业决策和个人研究至关重要。而网页抓取工具作为一种高效获取互联网数据的方式&#xff0c;正逐渐成为大家解决数据需求的得力助手。本文将深入探讨网页抓取工具的种类&#xff0c;并为大家提供简单实用的页面采集教…...

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…...

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…...

MySQL七 | 存储引擎

目录 存储引擎 存储引擎特点 存储引擎选择 Innodb与MyISAM区别 存储引擎 默认存储引擎:InnoDB show engines;#展示当前数据库支持的存储引擎 存储引擎特点 特点InnoDBMyISAMMemory存储限制64TB有有事务安全支持--锁机制行锁表锁表锁Btree锁支持支持 支持 Hash索引--支…...

网上下载的pdf文件,为什么不能复制文字?

不知道大家有没有到过这种情况&#xff1f;在网上下载的PDF文件打开之后&#xff0c;发现选中文字之后无法复制。甚至其他功能也都无法使用&#xff0c;这是怎么回事&#xff1f;该怎么办&#xff1f; 当我们发现文件打开之后&#xff0c;编辑功能无法使用&#xff0c;很可能是…...

Linux下apisix离线安装教程

Linux下apisix离线安装教程 一、首先需要安装etcd&#xff1a;二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd&#xff1a; 解压缩etcd后执行以下命令&#xff1a; tar -xvf etcd-v3.…...

基于STM32 + DMA介绍,应用和步骤详解(ADC多通道)

前言 本篇博客主要学习了解DMA的工作原理和部分寄存器解析&#xff0c;针对ADC多通道来对代码部分&#xff0c;应用部分作详细讲解&#xff0c;掌握代码编程原理。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客开发板使用的是正点原子精英版&am…...

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…...

计算机毕业设计springboot+ssm停车场车位预约系统java

管理员不可以注册账号 停车位包括车位所在楼层、车位编号、车位类型(全时间开放/高峰期开放)、预定状态等 用户预约时要求支付预约时间段的停车费用 违规行为&#xff1a;1.停车超过预约时间段 2.预约未使用 于系统的基本要求 &#xff08;1&#xff09;功能要求&am…...

破局奈奎斯特:从同步采样时序抖动到全链路EMC,高精度采集卡的超频设计边界

http://www.z-linear.com 在数据采集卡&#xff08;DAQ&#xff09;的选型手册中&#xff0c;工程师们习惯于紧盯“分辨率”和“采样率”这两个显性参数。然而&#xff0c;当面对极其苛刻的工业应用——例如多轴伺服电机的闭环控制、电网电能质量的高次谐波分析、或微弱生物电…...

ARM SVE指令集:UDOT与UMAX指令深度解析与优化实践

1. SVE指令集概述在ARMv8-A架构中&#xff0c;SVE&#xff08;Scalable Vector Extension&#xff09;作为新一代SIMD指令集扩展&#xff0c;突破了传统固定长度向量计算的限制。我第一次接触SVE是在开发图像处理算法时&#xff0c;当时被其"一次编写&#xff0c;自动适配…...

从lsusb输出到硬件信息库:如何查询Linux中USB设备的厂商和型号

从lsusb输出到硬件信息库&#xff1a;Linux下USB设备厂商与型号的深度解析 当你插入一个陌生的USB设备到Linux系统时&#xff0c;终端里 lsusb 命令输出的那一串神秘代码 ID xxxx:xxxx 往往让人摸不着头脑。这些十六进制数字背后隐藏着设备的真实身份——厂商和具体型号。本…...

雪球md5__1038签名逆向:从Chrome调试到Node.js稳定复现

1. 这不是“破解”&#xff0c;而是对前端加密逻辑的常规逆向工程实践你打开雪球网的行情接口&#xff0c;抓到一个带md5__1038xxx参数的请求&#xff0c;复制下来一试——换台电脑、换个时间、甚至只是刷新一下页面&#xff0c;参数就失效了。后端直接返回403 Forbidden或{&qu…...

Atomic Layout嵌套布局最佳实践:构建复杂UI系统的完整指南

Atomic Layout嵌套布局最佳实践&#xff1a;构建复杂UI系统的完整指南 【免费下载链接】atomic-layout Build declarative, responsive layouts in React using CSS Grid. 项目地址: https://gitcode.com/gh_mirrors/at/atomic-layout Atomic Layout是一个基于React的声…...

文章三:Elasticsearch 集群恢复和索引分布

集群恢复网关与集群索引分布必要性了解在 Elasticsearch&#xff08;简称 ES&#xff09;集群运维中&#xff0c;集群重启恢复、残余索引处理、索引分片分布是保障集群稳定性、数据完整性、读写性能的三大核心基础能力。多数集群故障、数据丢失、分片异常、读写卡顿问题&#x…...

ros2_control 代码架构分析

ros2_control 代码架构分析 一、整体框架 1.1 代码框架 ├── ros2_control/ # ★ 框架本体(vendored,jazzy 分支) │ ├── controller_manager/ # 核心运行时:ros2_control_node │ ├── hardware_interface/ # 硬件抽象 +…...

AArch64缓存架构解析与性能优化实践

1. AArch64缓存架构基础解析AArch64架构作为ARMv8指令集的64位执行状态&#xff0c;其缓存系统设计体现了现代处理器架构的典型特征。缓存作为CPU与主存之间的高速缓冲存储器&#xff0c;通过存储频繁访问的数据和指令来减少内存访问延迟。在AArch64中&#xff0c;缓存被组织为…...

Mac到手别急着装软件,先搞定这3个基础设置(含开启任意来源命令)

Mac新机必做的3项底层优化&#xff1a;从系统设置到高效工作流刚拆封的MacBook总带着一种特殊的仪式感——光滑的铝金属外壳、视网膜屏幕的细腻显示、以及那个等待被按下的电源键。但在这份新鲜感之后&#xff0c;许多用户会直接跳转到软件安装环节&#xff0c;却忽略了更重要的…...

博德之门3 2026最新官方正版免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)

拥抱高自由度探索&#xff1a;深挖《博德之门3》的幕后群像与核心构架 在当今节奏日益加快的电子游戏市场中&#xff0c;慢节奏的回合制硬核角色扮演游戏&#xff08;RPG&#xff09;能够突围并成为现象级作品并不多见。然而&#xff0c;有一款作品凭借极其庞大的网状叙事与深…...