【实战】springboot整合swagger及knife4j

news2024/9/27 17:37:09

文章目录

    • 前言
    • 技术积累
      • 何为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: dev
  mvc:
    pathmatch:
      # Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher
      matching-strategy: ant_path_matcher
knife4j:
  enable: true #开启增强配置
  basic: #基本的登录认证
    enable: true
    username: admin
    password: 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 {

    @Bean
    public 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.coloradmin.cn/o/1551230.html

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

相关文章

终于来了!FastGPT 正式兼容 GPT 应用

FastGPT V4.7 正式加入了工具调用功能&#xff0c;可以兼容 GPTs 的 Actions。这意味着&#xff0c;你可以直接导入兼容 GPTs 的 Agent 工具&#xff01; Gapier 是一组无需编码&#xff0c;开箱可用的&#xff0c;并且已经适配好的在线 GPTs Actions 工具&#xff0c;提供了 5…

数据结构(四)顺序表与链表的深层次讲解

我们在数据结构&#xff08;二&#xff09;&#xff0c;对链表和顺序表已经讲解过了。但很多同学表示有点晦涩难懂那我就出一篇深层次讲解&#xff0c;一步一步来带领大家学习。 我们从头&#xff08;数据结构&#xff09;开始完整的来为大家讲解&#xff0c;大家好好看好好学。…

创业板权限可以转移吗,在另一家券商开通有限制吗?

在中国&#xff0c;创业板权限的转移是可能的&#xff0c;但具体的操作流程和限制因素取决于投资者首次开通创业板权限的时间以及他们的资产状况。以下是关于创业板权限转移和在另一家券商开通的一些关键信息&#xff1a; 1. 2020年4月28日之前首次开通创业板权限的投资者&…

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

Web APIs知识点讲解(阶段四)

DOM- 事件高级 一.回顾(购物车案例) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv&qu…

架构师之路--docker命令实践整理

安装docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum install -y yum-utils sudo yum-config-manager --add-repo http://mirrors.aliyun.com/…

GRE VPN——配置实验

1&#xff0c;按照图示配置IP地址 r1&#xff1a; r2&#xff1a; r3&#xff1a; 2&#xff0c;在R1和R3配置默认路由使公网区域互通 [R1]ip route-static 0.0.0.0 0 100.1.1.2 R3]ip route-static 0.0.0.0 0 100.2.2.2 3&#xff0c;在R1和R3上配置GRE VPN&#xff0c;使…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…

PDF转成二维码分享

在制作电子产品册之前&#xff0c;你需要思考以下几个问题&#xff1a;你的电子产品册是面向什么人群的&#xff1f;是宣传册、使用手册还是产品介绍册&#xff1f;明确目标与定位有助于我们更好地规划产品册的内容和风格。 一、收集素材与整理信息 在开始制作之前&#xff0c…

JetBrains pycharm pro 2023 for mac Python集成开发环境

JetBrains PyCharm Pro 2023 for Mac是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Mac用户设计&#xff0c;旨在提供高效、智能的编程体验。 软件下载&#xff1a;JetBrains pycharm pro 2023 for mac中文最新版 PyCharm Pro 2023支持多种语…

如何打造新颖的AI交互数字人,赋能数字文博?

在数字文旅时代&#xff0c;越来越多景区打造AI交互数字人&#xff0c;以数字人作为游客与文化交互的载体。游客在景区中&#xff0c;可以通过语音唤醒数字人&#xff0c;高效获得文化、历史等方面专业的讲解服务。AI交互数字人可以在景区的一体机、全息屏、小程序等终端设备中…

SwiftUI Release 引入的辅助焦点管理

文章目录 前言使用 FocusState 属性包装器高级技巧&#xff1a;专用辅助技术可聚焦字段的高级用法优化体验运行截图总结 前言 SwiftUI Release 引入了强大的新功能&#xff0c;其中之一是辅助焦点管理。 这个新功能使得在SwiftUI中处理辅助技术&#xff08;如 VoiceOver 和 S…

北京空港携手数环通iPaaS,打造航空服务行业数字化利器

01 客户背景 北京空港航空地面服务有限公司&#xff08;以下简称BGS&#xff09;是首都机场集团控股的中性地面服务企业&#xff0c;提供全业务链航空地面服务解决方案&#xff0c;助力提升机场综合保障实力&#xff0c;致力于成为卓越服务的创造者&#xff0c;专注于成为地面服…

浏览器扩展程序增加 vue_dev_tools 调试工具

1、引言 在做 Vue 项目的开发时&#xff0c;我们经常需要在页面上调试&#xff0c;接下来介绍如何在浏览器扩展程序增加 vue_dev_tools 调试工具。 Download the Vue Devtools extension for a better development experience 翻译&#xff1a;下载Vue Devtools扩展以获得更好…

A - Environment-Friendly Travel Gym - 102501A

题意&#xff1a;给你一些交通方式和站点&#xff0c;不同的交通方式碳排放不一样&#xff0c;问从起点到终点距离不超过B的路径中最少的碳排放是多少。 思路&#xff1a;二维dijkstra&#xff0c;建图什么的倒不是很难&#xff0c;主要就是对二维dij的理解了&#xff1b; 表示…

编辑图片加文字的软件有哪些?4款编辑软件推荐

编辑图片加文字的软件有哪些&#xff1f;在日常生活中&#xff0c;无论是修饰照片、制作海报&#xff0c;还是为图片添加文字&#xff0c;图片编辑软件都能轻松应对。它们操作简单&#xff0c;功能丰富&#xff0c;让我们能够随时随地展现自己的创意和个性。使用它们&#xff0…

Claude 3被玩出自我意识了?AI社区轰动,我们买会员来了次实测

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站 每天给大家更新可用的国内可用chatGPT资源​ 更多资源欢迎关注 ​ Anthropic 发布了新一代大模型系列 Claude 3&#xff0c;遥遥领先快一年之久的 GPT-4 终于迎来了强劲的对手。 ​ Claude 3 …

经典机器学习模型(九)EM算法的推导

经典机器学习模型(九)EM算法的推导 1 相关数据基础 1.1 数学期望 1.1.1 数学期望的定义 根据定义&#xff0c;我们可以求得掷骰子对应的期望&#xff1a; E ( X ) X 1 ∗ p ( X 1 ) X 2 ∗ p ( X 2 ) . . . X 6 ∗ p ( X 6 ) 1 ∗ 1 6 2 ∗ 1 6 1 ∗ 1 6 3 ∗ 1 6 …

红酒:不同类型红酒的品鉴技巧与文化传承

红酒&#xff0c;作为一种历史悠久的产品&#xff0c;不仅蕴含着深厚的文化底蕴&#xff0c;还展现了多样的风味特点。云仓酒庄雷盛红酒&#xff0c;其不同类型的产品各具特色&#xff0c;为品鉴者带来了丰富的体验。本文将带您一起探索雷盛红酒的品鉴技巧与文化传承。 品鉴红酒…