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

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底部导航栏框架

废话不多说&#xff0c;上代码&#xff1a; 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(…...

关于自动化测试用例失败重试的一些思考

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

JS逆向之顶像滑块

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

【css】textarea-通过resize:none 禁止拖动设置大小

使用 resize 属性可防止调整 textareas 的大小&#xff08;禁用右下角的“抓取器”&#xff09;&#xff1a; 没有设置resize:none 代码&#xff1a; <!DOCTYPE html> <html> <head> <style> textarea {width: 100%;height: 150px;padding: 12px 20p…...

Linux内核学习小结

网上学习总结的一些资料&#xff0c;加上个人的一些总结。 Linux内核可以分成基础层和应用层。 基础层包括数据结构&#xff0c;内核同步机制&#xff0c;内存管理&#xff0c;任务调度。 应用层包括文件系统&#xff0c;设备和驱动&#xff0c;网络&#xff0c;虚拟化等。文件…...

八、ESP32控制8x8点阵屏

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

使用gitee创建远程maven仓库

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

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章

今次介绍一个应用程序单例唯一运行方案的代码。 我们知道&#xff0c;有些应用程序在操作系统中需要单例唯一运行&#xff0c;因为程序多开的话会对程序运行效果有影响&#xff0c;最基本的例子就是打印机&#xff0c;只能运行一个实例。这里将笔者单例运行的代码共享出来&…...

2023-08-07力扣今日二题

链接&#xff1a; 剑指 Offer 29. 顺时针打印矩阵 题意&#xff1a; 如题 解&#xff1a; 麻烦的简单题&#xff0c;具体操作类似走地图&#xff0c;使用一个长度四的数组表示移动方向 我这边的思路是如果按正常的方向没有路走了&#xff0c;那转向下一个方向一定有路&am…...

Spring接口ApplicationRunner的作用和使用介绍

在Spring框架中&#xff0c;ApplicationRunner接口是org.springframework.boot.ApplicationRunner接口的一部分。它是Spring Boot中用于在Spring应用程序启动完成后执行特定任务的接口。ApplicationRunner的作用是在Spring应用程序完全启动后&#xff0c;执行一些初始化任务或处…...

奶牛排队 java 思维题

&#x1f468;‍&#x1f3eb; 5133. 奶牛排队 题目描述 约翰的农场有 n n n 头奶牛&#xff0c;每一头奶牛都有一个正整数编号。 不同奶牛的编号不同。 现在&#xff0c;这 n n n 头牛按某种顺序排成一队&#xff0c;每头牛都拿出一张纸条写下了其前方相邻牛的编号以及其…...

uniapp 微信小程序 判断数据返回的是jpg还是pdf,以及pdf预览

<template> <view class"approval-notice"><block v-for"(imgItem, idx) in drivingLicense" :key"idx">//如果是非图片&#xff0c;那就走pdf预览<view class"pdf-item" v-if"Object.keys(thumbnail).incl…...

SpringBoot 的事务及使用

一、事务的常识 1、事务四特性&#xff08;ACID&#xff09; A 原子性&#xff1a;事务是最小单元,不可再分隔的一个整体。C 一致性&#xff1a;事务中的方法要么同时成功,要么都不成功,要不都失败。I 隔离性&#xff1a;多个事务操作数据库中同一个记录或多个记录时,对事务进…...

Android中的ABI

Android中的ABI ABI是Application Binary Interface的缩写。 ABI常表示两个程序模块之间的接口&#xff0c;且其中一个模块常为机器码级别的library或操作系统。 ABI定义了函数库的调用、应用的二进制文件&#xff08;尤其是.so&#xff09;如何运行在相应的系统平台上等细节…...

Python爬虫在用户行为模型构建中的应用与挑战

嗨&#xff0c;大家好&#xff01;作为一名专业的爬虫代理&#xff0c;我今天要和大家分享一些关于爬虫与人类行为分析的知识。在数字化时代&#xff0c;我们每天都在互联网上留下大量的数据痕迹&#xff0c;通过分析这些数据&#xff0c;我们可以理解用户行为、性偏好和需求&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&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。 …...

PE半透明屏是怎么制造的?工艺、材料、应用

PE半透明屏是一种新型的屏幕材料&#xff0c;具有半透明的特点。 它由聚乙烯&#xff08;PE&#xff09;材料制成&#xff0c;具有良好的透明度和柔韧性。PE半透明屏广泛应用于建筑、广告、展览等领域&#xff0c;具有很高的市场潜力。 PE半透明屏的特点之一是其半透明性。 它…...

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep&#xff1f; grep实例演示 命令参数&#xff1a; 案例演示&#xff1a; sed 概念&#xff1a; 常用选项&#xff1a; 案例演示&#xff1a; awk 概念&#xff1a; awk常用命令选项&#xff1a; awk变量&#xff1a; 内置变量 自定义变量 a…...

Phi-3-mini-4k-instruct-gguf保姆级教程:从CSDN GPU平台访问到结果导出全流程

Phi-3-mini-4k-instruct-gguf保姆级教程&#xff1a;从CSDN GPU平台访问到结果导出全流程 1. 认识Phi-3-mini-4k-instruct-gguf Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本。这个模型特别适合处理问答、文本改写、摘要整理以及简短创作等任务…...

25岁后为什么老得快?你的细胞在偷偷减少

有没有发现一个扎心的事实&#xff1a;25岁像是一道隐形的分水岭&#xff0c;把青春和初老狠狠隔开。20岁的时候&#xff0c;通宵打游戏、追剧、赶ddl&#xff0c;第二天睡半天就能满血复活&#xff0c;脸上看不到一丝疲惫&#xff0c;皮肤透着原生态的光泽&#xff0c;哪怕偶尔…...

gui 的高清与标清

现在无论对图层设计多样化 一般采用4层 或者更多&#xff1a;/*** file display_config.h* brief 显示配置头文件 - 定义图层管理和显示参数* details 采用4层图层设计&#xff0c;支持高清/标清自适应*/ ​ #ifndef DISPLAY_CONFIG_H #define DISPLAY_CONFIG_H ​ #include &l…...

【绝密架构图首次公开】:某头部券商万兆网卡直通+DPDK+自研内存池三级联动拓扑(支持128GB/s持续吞吐,QPS超2400万)

第一章&#xff1a;金融高频交易 C 内存池优化方法在纳秒级响应要求的金融高频交易系统中&#xff0c;动态内存分配&#xff08;new/delete&#xff09;引发的堆碎片、锁竞争与缓存不友好性&#xff0c;常导致不可预测的延迟尖峰。为消除 malloc 的内核态切换开销与全局堆锁争用…...

为什么2026年还有企业在用Excel算工资?新工具提升HR工作效率

HR工资系统软件是帮助企业实现薪酬自动化核算、个税申报、社保公积金管理的数字化工具。现代工资系统通常集成考勤、绩效、人事等模块&#xff0c;支持复杂薪酬规则配置&#xff0c;将HR从每月耗时数天的手工算薪中解放出来&#xff0c;准确率提升至99.9%以上。 为什么2026年还…...

OpenClaw多模型切换实战:千问3.5-35B-A3B-FP8与文本模型的协作流程

OpenClaw多模型切换实战&#xff1a;千问3.5-35B-A3B-FP8与文本模型的协作流程 1. 为什么需要多模型协作&#xff1f; 去年我在尝试用AI自动化处理工作流时&#xff0c;发现一个尴尬的问题&#xff1a;当我用同一个模型处理图片识别和文本写作时&#xff0c;要么图片理解能力…...

嵌入式开发中GNU C扩展特性解析与应用

1. 嵌入式开发中的C语言选择困境作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深刻理解C语言在这个领域无可替代的地位。但很多刚入行的朋友可能不知道&#xff0c;我们日常使用的"Linux C"和教科书上的"标准C"其实存在不少差异。第一次看到GNU…...

现在有开源的最好的矢量动画模型是什么,什么配置的电脑可以部署

目录 一、主流开源矢量动画模型对比 二、电脑配置方案&#xff08;按预算分级&#xff09; 1. 旗舰级&#xff08;稳跑 OmniLottie 高性能&#xff09; 2. 主流级&#xff08;稳跑 AnimateDiff 兼顾通用&#xff09; 3. 入门级&#xff08;轻量应用&#xff09; 三、关…...

深入SimpleFOC源码:为什么校准编码器时要将磁场固定在270度?一个硬件角度的解读

深入SimpleFOC源码&#xff1a;为什么校准编码器时要将磁场固定在270度&#xff1f;一个硬件角度的解读 当你第一次接触SimpleFOC库的编码器校准代码时&#xff0c;可能会对其中将电角度锁定在270度&#xff08;_3PI_2&#xff09;的操作感到困惑。这个看似随意的"魔法数字…...

深圳地铁大数据客流分析系统:如何用开源技术栈破解千万级乘客的交通治理难题

深圳地铁大数据客流分析系统&#xff1a;如何用开源技术栈破解千万级乘客的交通治理难题 【免费下载链接】SZT-bigdata 深圳地铁大数据客流分析系统&#x1f687;&#x1f684;&#x1f31f; 项目地址: https://gitcode.com/gh_mirrors/sz/SZT-bigdata 深圳地铁作为中国…...