【实战】springboot整合swagger及knife4j

文章目录

    • 前言
    • 技术积累
      • 何为swagger
      • 何为knife4j
      • Swagger2与Swagger3注解的主要区别
    • springboot整合swagger及knife4j
      • 导入maven依赖
      • yaml配置
      • 编写配置类
      • 编写实体和接口
    • 效果展示

前言

对于一个有着资深后端搬砖经验的人来说,最重要的事情就是写API文档了。一个好的API文档不仅仅能够提供给测试人员编写测试用例,也能够直接给前端使用查阅,可以避免很多在系统集成过程中的问题。这不,最近在整合架构的时候留意到了swagger和knife4j。本身swagger提供的web界面可以很好的调试和查阅,现在加上knife4j的API文档自动生成功能,简直不要太好。那么,今天就分享一期springboot整合swagger及knife4j吧!各位大大敬请鉴赏。

技术积累

何为swagger

首先OpenApi是业界真正的 api 文档标准,其是由 Swagger 来维护的,并被linux列为api标准,从而成为行业标准。

swagger 是一个 api 文档维护组织,后来成为了 Open API 标准的主要定义者,现在最新的版本为17年发布的 Swagger3(Open Api3)。国内绝大部分人还在用过时的swagger2(17年停止维护并更名为swagger3)swagger2的包名为 io.swagger,而swagger3的包名为 io.swagger.core.v3。

何为knife4j

Knife4j就是一个接口文档工具,可以看作是Swagger的升级版,但是界面比Swagger更好看,功能更丰富。早期,swagger-boostrap-ui是1.x版本,如今swagger-bootsrap-ui到2.x,同时也更改名字Knife4j,适用于单体和微服务项目。

Swagger2与Swagger3注解的主要区别

Swagger3基于OpenAPI Specification 3.0,这个新版本的规范带来了更多的灵活性和表达力。
以下是Swagger2和Swagger3注解的一些主要区别:

通用注解
Swagger2: 使用@Api来注解控制器类,表明该类的路径应该被Swagger文档化。
Swagger3: 不再需要@Api注解。Swagger3使用更自然的方式来扫描类路径,自动包含所有的控制器。

API信息和描述
Swagger2: 通过@ApiInfo和@ApiOperation注解来提供API的信息和操作描述。
Swagger3: 使用@Tag注解来替代@Api,并且通过@Operation注解来提供操作的描述。

路径和操作注解
Swagger2: 使用@ApiOperation来描述一个HTTP操作,@ApiImplicitParam和@ApiImplicitParams用于描述参数。
Swagger3: 引入了@Operation注解来描述HTTP操作,@Parameter注解用于描述参数。

参数注解
Swagger2: 参数注解是通过@ApiParam或@ApiImplicitParam来描述。
Swagger3: 使用@Parameter注解来描述参数,它提供了更丰富的属性,如schema、example和content。

请求体和响应体注解
Swagger2: 使用@ApiModel和@ApiModelProperty注解来描述请求和响应的数据模型。
Swagger3: 引入了@Schema注解来描述数据模型,提供了更多的细节和配置选项。

安全和授权注解
Swagger2: 使用@ApiResponses、@ApiResponse、@ApiOperation等注解来描述响应和错误码。
Swagger3: @ApiResponse注解仍然存在,但是现在可以包含更多的信息,如媒体类型和例子。

springboot整合swagger及knife4j

导入maven依赖

<!--Swagger-->
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>
<!--knife4j -->
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version>
</dependency>

yaml配置

knife4j 3.* 的版本会跟 springboot 3.6.* 版本冲突,以下是解决冲突的办法
在yaml文件中加入以下配置即可

server:port: 8888
spring:profiles:active: devmvc:pathmatch:# Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatchermatching-strategy: ant_path_matcher
knife4j:enable: true #开启增强配置basic: #基本的登录认证enable: trueusername: adminpassword: 123456

编写配置类

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.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;/*** SwaggerConfig* @author senfel* @version 1.0* @date 2024/3/27 16:04*/
@Configuration
@EnableOpenApi
public class SwaggerConfig {@Beanpublic Docket initDocket(Environment env) {//设置要暴漏接口文档的配置环境//设置要显示的Swagger环境Profiles profile = Profiles.of("test","dev");//获取项目的环境://通过environment.acceptsProfiles判断是否处在自己设定的环境当中boolean flag = env.acceptsProfiles(profile);return new Docket(DocumentationType.OAS_30).apiInfo(apiInfo())//是否启动swagger 默认为true ,如果为false,则Swagger不能再浏览器中访问.enable(flag).select()//RequestHandlerSelectors,配置要扫描接口的方式
//                .apis(RequestHandlerSelectors.any()):扫描全部
//                .apis(RequestHandlerSelectors.none()):不扫描
//                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class)):扫描类上的注解,参数是一个注解的反射对象
//                .apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class)):扫描方法上的注解//指定要扫描的包.apis(RequestHandlerSelectors.basePackage("com.example.ccedemo.controller"))//paths()过滤什么路径(url)
//                .paths(PathSelectors.ant("/pm/**")) 就是在localhost:8080/pm后面的路径
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))//不过滤.paths(PathSelectors.any()).build();//右上角 组(有几个Docket,有几个组)
//                .groupName();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("接口文档").description("接口文档").contact(new Contact("senfel", "", "XXXX@sina.cn")).version("V1.0").license("Apache 2.0").build();}
}

编写实体和接口

import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** Dept* @author senfel* @version 1.0* @date 2024/3/27 16:23*/
@Data
@ApiModel(description = "部门")
@AllArgsConstructor
@NoArgsConstructor
public class Dept {@Schema(description = "主键")private Long id;@Schema(description = "部门名")private String name;
}
import com.example.ccedemo.entity.Dept;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** DeptController* @author senfel* @version 1.0* @date 2024/3/27 16:25*/
@RestController
@Api(tags = "部门管理")
@RequestMapping("/sys/")
public class DeptController {/*** 获取部门* @param dept* @author senfel* @date 2024/3/27 16:34* @return org.springframework.http.ResponseEntity<com.example.ccedemo.entity.Dept>*/@GetMapping("/getDept")@ApiOperation(value = "获取部门")public ResponseEntity<Dept> get(@RequestParam Dept dept){System.err.println(dept.getName());return ResponseEntity.ok(dept);}
}

效果展示

浏览器访问http://localhost:8888/swagger-ui/即可访问到swagger3初始页面
在这里插入图片描述

输入配置文件中的用户名和密码
在这里插入图片描述

浏览器访问http://localhost:8888/doc.html即可访问knife4j初始页面

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列&#xff0c;需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

蓝桥杯真题Day40 倒计时19天 纯练题!

蓝桥杯第十三届省赛真题-统计子矩阵 题目描述 给定一个 N M 的矩阵 A&#xff0c;请你统计有多少个子矩阵 (最小 1 1&#xff0c;最大 N M) 满足子矩阵中所有数的和不超过给定的整数 K? 输入格式 第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数&#xf…

Python基本运算

1.逻辑运算符 第四行会有黄色的下划线是因为这个不是系统推荐的写法&#xff0c;系统推荐的是第五行的链式比较&#xff1b; 2.短路求值 对于and而言&#xff0c;左边的语句是false&#xff0c;那么整体一定是false,右边的表达式就不会进行计算&#xff1b; 对于or而言&…

Nginx 简介

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Nginx简介 Nginx具有轻量级、高性能和低内存占用等特点&#xff0c;可以在多核处理器上有效地分配负载。它可以作为静态内容服务器&#xff0c;也可以作为反向代理服务器&#xff0c;将请…

【软考】UML中的图之状态图

目录 1. 说明2. 图示 1. 说明 1.状态图&#xff08;State Diagram&#xff09;展现了一个状态机。2.由状态、转换、事件和活动组成。3.关注系统的动态视图。4.对于接口、类和协作的行为建模尤为重要。5.强调对象行为的事件顺序。6.通常包括简单状态和组合状态、转换&#xff0…

基于ssm的bbs论坛系统

开发环境&#xff1a;idea 前端&#xff1a;JQueryBootstraplayui后端&#xff1a;SpringSpringMVCMybatis数据库&#xff1a;mysqlredis 基于ssm的bbs论坛系统&#xff0c;功能有论坛、导读、动态、排行榜以及后台管理系统等等 话不多说&#xff0c;看图&#xff01;&#x…

13 完全分布式搭建-集群配置

1.集群部署规划 NameNode 和 SecondaryNameNode 不要安装在同一台服务器 ResourceManager 也很消耗内存&#xff0c;不要和 NameNode、SecondaryNameNode 配置在 同一台机器上。 在文章中与教材上有区别&#xff0c;在理论课上已讲解。 masterslave01slave02HDFS NameNode D…

初入C++

C 编译时的查找&#xff1a; 先到函数局部域里查找到全局域找 局部域和全局域会改变生命周期。 命名空间域不会影响变量的生命周期。 默认情况下不会到命名空间域去找。(命名空间域内的变量的生命周期是全局的&#xff0c;及不会出命名空间就销毁) 在不同的作用域可以定义同…

mysql主从复制、读写分离

一、主从复制架构和原理 1.1 主从复制类型 基于SQL语句的复制(STATEMENT默认) 基于行的复制(ROW&#xff09; 混合类型的复制(MIXED) 1.2主从复制的工作流程及原理 1.2.1 工作流程 ① 当数据来的时候&#xff0c;主服务器把操作记录二进制日志中&#xff0c;存储放入磁盘 ②…

SpringCloud Alibaba实战和源码(8)OpenFeign使用

1、 使用Feign实现远程HTTP调用 1.1、常见HTTP客户端 HttpClient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协 议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 J…

3.28学习总结

java 封装 封装体现了java的面向对象的特点,用户不用知道程序是如何运行的,只用按照所给的格式输入参数,便可得到对应的结果. 一个完整的封装需要每个实例变量都用private来修饰并拥有相应的public getter和setter方法. 代码 public class girl {private int age;public st…

爬取豆瓣电影分类排行榜中的电影详情数据

进入界面&#xff0c;右键打开检测&#xff0c;选择网络 然后网页滚动条拉倒最下面使其刷出新的数据&#xff0c;然后查看数据包 编写代码 import requests import jsonif __name__ __main__:get_url https://movie.douban.com/j/chart/top_listheaders {User-Agent:Mozil…

每日一题 --- 快乐数[力扣][Go]

快乐数 题目&#xff1a;202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到…

云原生应用(5)之Dockerfile精讲及新型容器镜像构建技术

一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像&#xff0c;主要因为容器镜像是容器模板&#xff0c;通过容器镜像我们才能快速创建容器。 如下图所示&#xff1a; Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOS Ubuntu 在…

OSCP靶场--GLPI

OSCP靶场–GLPI 考点(CVE-2022-35914 php执行函数绕过ssh端口转发jetty xml RCE) 1.nmap扫描(ssh端口转发) ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.194.242 -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-26 22:22 EDT Nmap…

游戏本笔记本更换@添加内存条实操示例@DDR5内存条

文章目录 添加内存条的意义准备工具设备拔出电源适配器并关机&#x1f47a;样机 内存条上的金手指安装过程Notes 安装后开机初次开机速度屏幕显示分辨率和闪烁问题检查安装后的效果 添加内存条的意义 参考双通道内存DDR5多通道内存-CSDN博客 准备工具 准备一个质量差不多的螺…

go面向对象

继承 封装 多态 定义结构体 //定义老师的结构体 type Teacher struct {Name stringAge intSchool string }func main() {var t1 Teacherfmt.Println(t1)t1.Name "tom"t1.Age 20t1.School "school"fmt.Println(t1) } 结构体实例的创建 package ma…

c++ 有名对象和匿名对象

c 有名对象和匿名对象 有名对象就是有名字的对象&#xff0c;匿名对象就是没有名字的对象。 #define _CRT_SECURE_NO_WARNINGS 1 using namespace std; #include<iostream> class score { public:score(){math 100;chinese 100;english 100;}score(int _math, int _…

spring-boot-devtools配置和原理

一、前言 昨天&#xff0c;一个同事Eclipse在启动SpringBoot项目时一直不停地加载&#xff0c;后来发现是因为spring-boot-devtools造成的问题&#xff0c;因为我们把日志输出的目录设置在当前项目里&#xff08;~/mnt/logs/&#xff0c;这样设置是因为mac电脑没有根目录权限&…

MySQL进阶之(六)索引的使用与设计原则

六、索引的使用与设计原则 6.1 索引的声明与使用6.1.1 索引的分类01、普通索引02、唯一性索引03、主键索引04、单列索引05、多列索引&#xff08;组合索引、联合索引&#xff09;06、全文索引07、空间索引 6.2 创建索引6.2.1 创建表时创建索引01、创建普通索引02、创建唯一索引…