1 swagger简单案例
1.1 加入依赖
<!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.8.7</version>
</dependency>
1.2 在config包中写swagger配置类SwaggerConfig
swagger配置类的代码如下:(直接套用,但部分需要修改)
package com.ieslab.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket docket(Environment environment){// 设置要现实的swagger环境Profiles profiles = Profiles.of("dev","test");// 获取项目的环境,如果项目环境在profiles中则返回trueboolean flag = environment.acceptsProfiles(profiles);return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) //配置 Swagger ApiInfo 基本信息.groupName("jiangzeyu").enable(flag) //配置是否启动swagger.select()//RequestHandlerSelector配置要扫描接口的方式//basePackage:指定要扫描的包.apis(RequestHandlerSelectors.basePackage("com.ieslab.demo.controller"))/** paths():只扫描哪些类* any()代表扫描全部* none()代表都不扫描* withClassAnnotation:扫描类上有某个注解的接口,比如说RestController就是扫描类上有@RestController的类生成接口* withMethodAnnotation:扫描方法上有某个注解的接口,比如说GetMapping就是扫描方法上有@GetMapping的类生成接口* ant(“/hello/*”):扫描包含/hello/**请求的类生成接口*/.paths(PathSelectors.any()).build(); //工厂模式}@Beanpublic Docket docket1(){return new Docket(DocumentationType.SWAGGER_2).groupName("A").enable(true);}@Beanpublic Docket docket2(){return new Docket(DocumentationType.SWAGGER_2).groupName("B").enable(true);}//配置 Swagger信息=apiInfoprivate ApiInfo apiInfo(){//作者信息Contact contact = new Contact("zhangsan","无","333@qq.com");return new ApiInfo("Swagger API 文档", //文档标题"这个是一个 Swagger 接口文档。", //文档描述"v1.0", //文档版本"没有网站", //队伍的网站地址contact, //作者信息"Apache 2.0", //许可证"http://www.apache.org/licenses/LICENSE-2.0",//许可证Urlnew ArrayList());}}
剖析:
在类上要加入两个注解:@Configuration和@EnableSwagger2;
然后开始写docket方法,返回Docket对象,入参是Environment environment,用来后续对application的环境进行判断,控制swagger是否启动:
// 设置要现实的swagger环境,dev代表application-dev.yaml
Profiles profiles = Profiles.of("dev","test");
// 获取项目的环境,如果项目环境在profiles中则返回true
boolean flag = environment.acceptsProfiles(profiles);
接着,返回配置的Docket对象:
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) // 配置 Swagger ApiInfo 基本信息,因此要创建apiInfo方法.groupName("jiangzeyu") .enable(flag) //配置是否启动swagger.select()//RequestHandlerSelector配置要扫描接口的方式//basePackage:指定要扫描的包.apis(RequestHandlerSelectors.basePackage("com.ieslab.demo.controller"))/** paths():只扫描哪些类,()里的参数有any()、none()、ant(“需要扫描的请求”)、withClassAnnotation、withMethodAnnotation,后面两个不常用,请自行百度* any()代表扫描全部* none()代表都不扫描* withClassAnnotation:扫描类上有某个注解的接口,比如说RestController就是扫描类上有@RestController的类生成接口* withMethodAnnotation:扫描方法上有某个注解的接口,比如说GetMapping就是扫描方法上有@GetMapping的类生成接口* ant(“/hello/*”):扫描包含/hello/**请求的类生成接口*/.paths(PathSelectors.any()).build(); //工厂模式}
其中,apiInfo传入apiInfo方法返回的ApiInfo对象(需要自己写apiInfo方法),enable传入的参数可由项目的环境决定,apis(RequestHandlerSelectors.basePackage())传入的是需要扫描的包路径,paths()传入的是在包路径下扫描哪些类,groupName() 传入的是测试接口归属哪个人,如下图所示:
多个docket方法就可以代表不同人的测试接口:(注意方法名不要相同!)
@Beanpublic Docket docket1(){return new Docket(DocumentationType.SWAGGER_2).groupName("A").enable(true);}@Beanpublic Docket docket2(){return new Docket(DocumentationType.SWAGGER_2).groupName("B").enable(true);}
效果:
apiInfo()方法如下:套模板即可。
//配置 Swagger信息=apiInfoprivate ApiInfo apiInfo(){//作者信息Contact contact = new Contact("zhangsan","无","333@qq.com");return new ApiInfo("Swagger API 文档", //文档标题"这个是一个 Swagger 接口文档。", //文档描述"v1.0", //文档版本"没有网站", //队伍的网站地址contact, //作者信息"Apache 2.0", //许可证"http://www.apache.org/licenses/LICENSE-2.0",//许可证Urlnew ArrayList());}
1.3 创建实体类User
package com.ieslab.demo.emtity;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("这是User的实体类") // 给实体类加文档注释
public class User {@ApiModelProperty("主键id")private Integer userId;@ApiModelProperty("用户名")private String username;@ApiModelProperty("密码")private String password;}
剖析:只要实体类在Controller被使用,而控制类又被swagger扫描到,就会被展示出来,实体类的注解都是给文档加注释用的。
1.4 创建UserDao接口和UserDaoImpl实现类
UserDao:
package com.ieslab.demo.dao;import com.ieslab.demo.emtity.User;public interface UserDao {// 添加用户User addUser(Integer userId,String userName,String password);}
UserDaoImpl:因为前端传来的是一个JSON对象,会使用@RequestBody将其封装为User对象,然后从这个User对象中拿各个属性。
package com.ieslab.demo.dao.impl;import com.ieslab.demo.dao.UserDao;
import com.ieslab.demo.emtity.User;
import org.springframework.stereotype.Repository;import java.util.HashMap;
import java.util.Map;@Repository
public class UserDaoImpl implements UserDao {private static Map<Integer,User> userMap = null;static {userMap = new HashMap<Integer, User>();userMap.put(100,new User(100,"zhangsan","777"));userMap.put(102,new User(102,"lisi","888"));userMap.put(103,new User(103,"wangwu","999"));userMap.put(104,new User(104,"zhaoliu","000"));}@Overridepublic User addUser(Integer userId,String userName,String password) {User user = new User(userId,userName,password);userMap.put(user.getUserId(),user);return user;}}
1.5 创建Controller对象,接收请求
package com.ieslab.demo.controller;
import com.ieslab.demo.dao.UserDao;
import com.ieslab.demo.emtity.User;
import io.swagger.annotations.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
public class MyController {@Autowired // 相当于使用new UserDaoimpl()private UserDao userDao;@PostMapping(value = "/addUser")@ApiOperation(value = "AddUser接口",httpMethod = "POST",notes = "这是AddUser接口的详细说明") // 给方法加注释public User addUser(@RequestBody @ApiParam("用户") User userInput){ // 加入@RequestBody Spring自动将传过来的JSON类型的数据和我们的类匹配,说明输入是JSON格式的数据User user = userDao.addUser(userInput.getUserId(), userInput.getUsername(), userInput.getPassword());return user;}}
剖析:
重点在于Post方法不能接收基本类型的数据,需要把它们用JSON格式进行封装,然后@RequestBody会把JSON格式的数据转为对应的实体类。
注意!类上的是@RestController而不是@Controller,因为@Controller后类中的方法return的要转发的页面,而不会被以指定的格式写入Http response body中。
其他大部分注解都是加注释用的:
1.6 使用swagger进行测试
访问:http://localhost:8080/swagger-ui.html
然后选择自己的组,点击控制类:
点击要测试的接口(方法):
点击try it out开始测试:
编辑要传入的JSON数据,编辑后执行:
测试成功:
相关文章:

1 swagger简单案例
1.1 加入依赖 <!--swagger图形化接口--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency><dependency><groupId>io.spri…...
Flutter写一个android底部导航栏框架
废话不多说,上代码: import package:flutter/material.dart;void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(title: Bottom Navigation Bar,theme: ThemeData(…...

关于自动化测试用例失败重试的一些思考
自动化测试用例失败重跑有助于提高自动化用例的稳定性,那我们来看一下,python和java生态里都有哪些具体做法? 怎么做 如果是在python生态里,用pytest做测试驱动,那么可以通过pytest的插件pytest-rerunfailures来实现…...

JS逆向之顶像滑块
本教程仅限于学术探讨,也没有专门针对某个网站而编写,禁止用于非法用途、商业活动、恶意滥用技术等,否则后果自负。观看则同意此约定。如有侵权,请告知删除,谢谢! 目录 一、接口请求流程 二、C1包 三、ac 四…...

【css】textarea-通过resize:none 禁止拖动设置大小
使用 resize 属性可防止调整 textareas 的大小(禁用右下角的“抓取器”): 没有设置resize:none 代码: <!DOCTYPE html> <html> <head> <style> textarea {width: 100%;height: 150px;padding: 12px 20p…...
Linux内核学习小结
网上学习总结的一些资料,加上个人的一些总结。 Linux内核可以分成基础层和应用层。 基础层包括数据结构,内核同步机制,内存管理,任务调度。 应用层包括文件系统,设备和驱动,网络,虚拟化等。文件…...

八、ESP32控制8x8点阵屏
引脚的说明如下 上图中 C表示column 列的意思,所有的C接高电压,即控制esp32中输出1L表示line 行的意思,所有的L接低电压,即控制esp32中输出为01. 运行效果 2. 点阵屏引脚...

使用gitee创建远程maven仓库
1. 创建一个项目作为远程仓库 2. 打包项目发布到远程仓库 id随意,url是打包到哪个文件夹里面 在需要打包的项目的pom中添加 <distributionManagement><repository><id>handsomehuang-maven</id><url>file:D:/workspace/java/2023/re…...

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章
今次介绍一个应用程序单例唯一运行方案的代码。 我们知道,有些应用程序在操作系统中需要单例唯一运行,因为程序多开的话会对程序运行效果有影响,最基本的例子就是打印机,只能运行一个实例。这里将笔者单例运行的代码共享出来&…...
2023-08-07力扣今日二题
链接: 剑指 Offer 29. 顺时针打印矩阵 题意: 如题 解: 麻烦的简单题,具体操作类似走地图,使用一个长度四的数组表示移动方向 我这边的思路是如果按正常的方向没有路走了,那转向下一个方向一定有路&am…...

Spring接口ApplicationRunner的作用和使用介绍
在Spring框架中,ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后,执行一些初始化任务或处…...
奶牛排队 java 思维题
👨🏫 5133. 奶牛排队 题目描述 约翰的农场有 n n n 头奶牛,每一头奶牛都有一个正整数编号。 不同奶牛的编号不同。 现在,这 n n n 头牛按某种顺序排成一队,每头牛都拿出一张纸条写下了其前方相邻牛的编号以及其…...
uniapp 微信小程序 判断数据返回的是jpg还是pdf,以及pdf预览
<template> <view class"approval-notice"><block v-for"(imgItem, idx) in drivingLicense" :key"idx">//如果是非图片,那就走pdf预览<view class"pdf-item" v-if"Object.keys(thumbnail).incl…...

SpringBoot 的事务及使用
一、事务的常识 1、事务四特性(ACID) A 原子性:事务是最小单元,不可再分隔的一个整体。C 一致性:事务中的方法要么同时成功,要么都不成功,要不都失败。I 隔离性:多个事务操作数据库中同一个记录或多个记录时,对事务进…...
Android中的ABI
Android中的ABI ABI是Application Binary Interface的缩写。 ABI常表示两个程序模块之间的接口,且其中一个模块常为机器码级别的library或操作系统。 ABI定义了函数库的调用、应用的二进制文件(尤其是.so)如何运行在相应的系统平台上等细节…...
Python爬虫在用户行为模型构建中的应用与挑战
嗨,大家好!作为一名专业的爬虫代理,我今天要和大家分享一些关于爬虫与人类行为分析的知识。在数字化时代,我们每天都在互联网上留下大量的数据痕迹,通过分析这些数据,我们可以理解用户行为、性偏好和需求&a…...
LangChain与大模型的学习
这里写目录标题 问题记录1、库的版本问题 实例记录1、公司名生成2 提示模板的使用3LLM Chain 参考资料 问题记录 1、库的版本问题 openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(hostapi.openai.com, port443): Max retries excee…...

C语言标准定义的32个关键字
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 …...

PE半透明屏是怎么制造的?工艺、材料、应用
PE半透明屏是一种新型的屏幕材料,具有半透明的特点。 它由聚乙烯(PE)材料制成,具有良好的透明度和柔韧性。PE半透明屏广泛应用于建筑、广告、展览等领域,具有很高的市场潜力。 PE半透明屏的特点之一是其半透明性。 它…...

linux文本三剑客---grep,sed,awk
目录 grep 什么是grep? grep实例演示 命令参数: 案例演示: sed 概念: 常用选项: 案例演示: awk 概念: awk常用命令选项: awk变量: 内置变量 自定义变量 a…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...