SpringBoot集成Knife4j接口管理工具

news2025/4/5 22:21:33

SpringBoot集成Knife4j接口管理工具

    • 1、导入依赖包
    • 2、配置Knife4j
    • 3、放行Knife4j的请求
    • 4、使用Knife4j注解
    • 5、实现效果

  平时开发项目都用的是Swagger2或者Swagger3,但是这两个UI看起来不是很舒服,今天看到了Knife4j,它对Swagger进行了增强,有很多个性化需求。Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案。

  官网地址:https://doc.xiaominfo.com/

1、导入依赖包

  在maven项目的pom.xml中引入Knife4j的依赖包

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.9</version>
        </dependency>

  可以在Dependencies中查看是否引入成功。

image-20230224220214820

2、配置Knife4j

  在SpringBoot中创建swagger的配置类,如下

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token")
                .description("用户token")
                .defaultValue("")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false)
                .build();
        pars.add(tokenPar.build());
        //添加head参数end

        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        //.title("swagger-bootstrap-ui-demo RESTful APIs")
                        .description("# swagger-bootstrap-ui-demo RESTful APIs")
                        .termsOfServiceUrl("www.codeleader.top")
                        .contact("test@qq.com")
                        .version("1.0")
                        .build())
                .globalOperationParameters(pars)
                //分组名称
                .groupName("2.X版本")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.java1234"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}

  官网的配置如下图所示,我多配置了个head参数,目的是为了每次请求的时候在请求头上带上token参数,方便后端JWT的校验。

image-20230224220444253

3、放行Knife4j的请求

  由于我项目集成了SpringSecurity,所以这些请求默认都会被拦截,所以这里在配置类中放行这些文档的请求就行。

  在SpringSecurity配置类中重写WebSecurityConfigurerAdapter类的configure(WebSecurity web)方法,在这里放行指定的请求即可。

/**
     * 配置哪些请求不拦截,放行swagger
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
       web.ignoring().mvcMatchers("/favicon.ico","/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**", "/doc.html");
    }

4、使用Knife4j注解

@Api(tags = "用户管理")
@RestController
@RequestMapping("/sys/user")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @Autowired
    private SysRoleService sysRoleService;

    @Autowired
    private SysUserRoleService sysUserRoleService;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    @Value("${avatarImagesFilePath}")
    private String avatarImagesFilePath;

    @ApiOperation("更新个人信息")
    @PostMapping("/save")
    @PreAuthorize("hasAnyAuthority('system:user:edit','system:user:add')")
    public R save(@RequestBody @Valid SysUser sysUser){
        if(sysUser.getId()==null||sysUser.getId()==-1){
            sysUser.setPassword(bCryptPasswordEncoder.encode(sysUser.getPassword()));
            sysUserService.save(sysUser);
        }else{
            sysUserService.updateById(sysUser);
        }
        return R.ok();
    }

    @ApiOperation("修改密码")
    @PostMapping("updateUserPwd")
    @PreAuthorize("hasAuthority('system:user:edit')")
    public R updateUserPwd(@RequestBody SysUser sysUser){
        SysUser currentUser = sysUserService.getById(sysUser.getId());
        if(bCryptPasswordEncoder.matches(sysUser.getOldPassword(),currentUser.getPassword())){
            currentUser.setPassword(bCryptPasswordEncoder.encode(sysUser.getNewPassword()));
            sysUserService.updateById(currentUser);
            return R.ok();
        }else{
            return R.error("输入旧密码错误!");
        }

    }
}

  @Api(tags = "用户管理")定义标签分组接口,在这个类下定义的所有接口将位于这个标签之下

  @ApiOperation()定义具体的接口标题信息,notes可以为这个标签添加注释

  常用注解如下:

注解作用
@Api修饰整个类,描述Controller的作用
@ApiOperation描述一个类的一个方法,或者说一个接口
@ApiParam单个参数描述
@ApiModel用对象来接收参数
@ApiProperty用对象接收参数时,描述对象的一个字段
@ApiResponseHTTP响应其中1个描述
@ApiResponsesHTTP响应整体描述
@ApiIgnore使用该注解忽略这个API
@ApiError发生错误返回的信息
@ApiImplicitParam一个请求参数
@ApiImplicitParams多个请求参数

5、实现效果

  启动Spring Boot工程,在浏览器中访问:http://localhost/doc.html,我用的80端口,可以省略端口号。

image-20230224222018877

查看接口文档:

image-20230224222104608

调试接口:

image-20230224222117065

请求头这里默认有个token参数,是因为我在上面配置类中写的

image-20230224222149551

我们也可以在文档管理这里添加全局参数

image-20230224222222632

这个界面用起来比swagger-ui稍微舒服点,还可以。

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

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

相关文章

华为OD机试题【和最大子矩阵】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明和最大…

3.ffmpeg命令行环境搭建、ffmpeg命令行初步了解

在上章,我们讲过: ffmpeg.exe: 主要用于转码或者剪切的应用程序, 也可以从url/现场音频/视频源抓取输入源ffplay.exe: 主要用于播放视频的应用程序,该应用程序源码是开源的,我们后面章节会去源码分析ffprobe.exe: 主要用于分析视频码流的应用程序, 可以获取媒体文件的详细信息,…

Jupyterlab 学习与测试笔记

前言本篇博客主要解决阿里云服务器上Jupyterlab配置方面的一些问题。1、安装完无法启动Jupyterlab首先声明&#xff0c;我在Anaconda3安装过程中已经设置了将安装相关的Python&#xff0c;ipython&#xff0c;Jupyter等添加到环境变量。但是一开始安装完&#xff0c;直接在命令…

从计费出账加速的设计谈周期性业务的优化思考

1号恐惧症 你有没有这样的做IT的朋友&#xff1f;年纪轻轻&#xff0c;就头发花白或者秃顶&#xff0c;然后每个月周期性的精神不振&#xff0c;一到月底&#xff0c;就有明显的焦虑。如果有&#xff0c;他可能就是运营商行业做计费运营的&#xff0c;请对他好点&#xff0c;特…

【LeetCode】剑指 Offer(12)

目录 题目&#xff1a;剑指 Offer 30. 包含min函数的栈 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 30. 包含m…

【Node.js算法题】数组去重、数组删除元素、数组排序、字符串排序、字符串反向、字符串改大写 、数组改大写、字符替换

文章目录前言数组去重数组删除元素数组排序字符串排序字符串反向字符串改大写数组改大写字符替换字符替换运行结果&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/8ac1c15e6f0944cdb8ca50bcb844182a.png)总结前言 本期文章是js的一些算法题&#xff0c;包括…

FreeRTOS入门(07):流缓冲区 消息缓冲区

文章目录目的基础说明流缓冲区相关函数使用演示消息缓冲区相关函数使用演示总结目的 缓冲区是操作系统中常见的一种用于任务间数据传递的机制。这篇文章将对FreeRTOS中相关内容做个介绍。 本文代码测试环境见前面的文章&#xff1a;《FreeRTOS入门&#xff08;01&#xff09;…

Flink:The generic type parameters of ‘Collector‘ are missing 类型擦除

类型擦除问题处理报错日志描述问题描述报错解决其他方法方法一&#xff1a;TypeInformation方法二&#xff1a;TypeHint报错日志描述 报错日志&#xff1a; The generic type parameters of Collector are missing. In many cases lambda methods dont provide enough informa…

双边滤波和交叉双边滤波

什么是双边滤波 双边滤波是一种局部的、非线性的、非迭代的滤波技术&#xff0c;它将经典的低通滤波器与边缘停止函数相结合&#xff0c;当像素之间的强度差较大时&#xff0c;边缘停止函数会衰减滤波器的核心。由于同时考虑了相邻像素的灰度相似度和几何贴近度&#xff0c;滤…

使用开源httpworkshop执行http api测试与资源下载

平时我们在涉及HTTP开发时&#xff0c;会使用postman做api测试&#xff0c;优点是界面友好&#xff1b;平时我们写爬虫查找网络资源一般使用python编写脚本&#xff0c;优点是脚本支持的功能灵活&#xff1b;其实网络上做HTTP测试的工具和产品特别的多&#xff0c;但是都是做好…

锐捷(十六)mpls vxn option c 带RR场景

一 实验拓扑二 实验需求如图模拟R1在北京&#xff0c;R10在上海&#xff0c;要求二者之间用loopback口进行通信由于公司机密性质&#xff0c;要求二者需要使用mpls vxn 虚拟专线的方式进行通信本实验采取option c带RR的方式模拟通信左边AS100&#xff0c;右边AS200&#xff0c;…

19万字智慧城市总体规划与设计方案word

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 1.1.1 感知基础设施 感知基础设…

数据库三大范式和个人看法

三大范式图解概括 第一范式(1NF) 确保数据库表字段的原子性 会存在数据冗余过大&#xff0c;插入异常&#xff0c;删除异常&#xff0c;修改异常的问题 举例&#xff1a; 某个字段name&#xff1a;‘西瓜 1566666‘ 依照第一范式就需要拆分成 name:‘西瓜’ ,phone:1566666’ …

房产营销、地产中介如何高效低成本获客?

数字化对企业而言&#xff0c;机遇和挑战并存。房产企业可借助数字化加强日益扩大的业务规模和业务领域管理&#xff0c;以提升管理效率&#xff0c;降低管理难度&#xff1b;基于数字化技术加强客户的服务体验&#xff0c;进而收集多业态客户和场景数据&#xff0c;拓展创新业…

计算机组成原理(2.1)--系统总线

目录 一、总线基本知识 1.总线 2.总线的信息传送 3.分散连接图 4.注 二、总线结构的计算机举例 1.面向 CPU 的双总线结构框图 2.单总线结构框图 3.以存储器为中心的双总线结构框图 三、总线的分类 1.片内总线 2.系统总线 &#xff08;板级总线或板间总线&#…

【leetcode】寻找重复数

题目链接&#xff1a;寻找重复数https://leetcode.cn/problems/find-the-duplicate-number/ 方法一&#xff1a;快慢指针 因为只有一个数字是重复的&#xff0c;且一个数字正好对应一个唯一的下标&#xff0c;所以可以将数组抽象为一个链表&#xff0c;假定数组为{1,2,3,4,5,…

Java内置队列和高性能队列Disruptor

一、队列简介 队列是一种特殊的线性表&#xff0c;遵循先入先出、后入后出&#xff08;FIFO&#xff09;的基本原则&#xff0c;一般来说&#xff0c;它只允许在表的前端进行删除操作&#xff0c;而在表的后端进行插入操作&#xff0c;但是java的某些队列运行在任何地方插入删…

拆解钉钉流程审批功能:卡片式配置的审批流是怎样设计的?

有个客户要求我们做个定制开发&#xff0c;客户觉得钉钉的操作体验比较不错&#xff08;用户使用的惯性&#xff09;&#xff0c;要求我们要实现钉钉的自动配置审批流程&#xff0c;不过幸不辱命&#xff0c;对比个钉钉的流程审批、表单配置的相关功能&#xff0c;做了个Java私…

世界上最流行的编程语言,用户数超过Python,Java,JavaScript,C的总和!

世界上最流行的编程语言是什么&#xff1f; Python? Java? JavaScript? C&#xff1f;都不是&#xff0c;是Excel&#xff01;外媒估计&#xff0c;全球有12亿人使用微软的Office套件&#xff0c;其中估计有7.5亿人使用Excel&#xff01;可是Excel不就是能写点儿公式&#x…

华为OD机试题【合并数组】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明合并数…