原文网址:Knife4j系列--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客

简介

说明

本文用示例介绍knife4j的用法。(SpringBoot整合knife4j)

Knife4j是一个很好用的接口文档工具。之前用过Swagger,觉得页面不太好,浏览技术网站时,偶然发现swagger-bootstrap-ui,它能将接口进行归类。

早期,swagger-boostrap-ui是1.x版本,如今swagger-bootsrap-ui到2.x,同时也更改名字Knife4j,适用于单体和微服务项目。

Knife4j跟Swagger用法基本一样,swagger用法见:Swagger--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客

官网

首页:knife4j
文档:knife4j
gitee地址:https://gitee.com/xiaoym/knife4j

技术星球

我建立了一个IT技术星球,网站是:learn.skyofit.com(自学精灵)。内容有:Java真实面试题Java设计模式实战、Shiro项目实战、Idea和Navicat的“魔法”教程、SpringBoot进阶、架构与微服务设计、高并发实战、Java入门实战、网站防御技术、JavaWeb入门项目等。

网站的定位:系列文章、高质量、注重实战、贴近实际项目,适合如下人群:入门学Java的、想进阶为高级Java开发的、想进阶为Java架构师的、想跳槽的、想升职加薪的、想防御网站被黑客攻击的。欢迎加入~

实例

官网文档:1.6 快速开始 | knife4j

依赖及配置

依赖

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

本处我使用比较新的版本展示。(目前2.0.9是最新的发布版,最稳定。)

版本的区别如下:

版本

说明

1.9.6

蓝色皮肤风格,开始更名,增加更多后端模块

2.0~2.0.5

Ui重写,底层依赖的springfox框架版本是2.9.2

2.0.6~

底层springfox框架版本升级至2.10.5,OpenAPI规范是v2

3.0~

底层依赖springfox框架版本升级至3.0.3,OpenAPI规范是v3

Knife4j配置(非必要)

配置方案:使用openApi3.0

默认引入包就可以直接用了(无需配置)。本处只是示例如果自定义一些东西该怎么写。

package com.example.demo.config;import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableOpenApi
// @EnableKnife4j
// @EnableSwagger2
public class Knife4jConfig {@Beanpublic Docket docket() {Docket docket = new Docket(DocumentationType.OAS_30).apiInfo(new ApiInfoBuilder().title("我的标题").description("我的描述")// .termsOfServiceUrl("http://www.xx.com/").contact(new Contact("knife", "https://knife.blog.csdn.net/", "xx@qq.com")).version("1.0").build())// 分组名称.groupName("all").select()// 这里指定Controller扫描包路径.apis(RequestHandlerSelectors.basePackage("com.example.demo")).paths(PathSelectors.any()).build();return docket;}
}

其他配置方案:使用swagger2

package com.example.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class Knife4jConfig {@Bean(value = "defaultApi2")public Docket defaultApi2() {Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(new ApiInfoBuilder().title("我的标题").description("我的描述")// .termsOfServiceUrl("http://www.xx.com/").contact(new Contact("IT利刃出鞘", "https://knife.blog.csdn.net", "xx@qq.com")).version("1.0").build())//分组名称.groupName("all").select()//指定Controller扫描路径。可以不具体到controller,它会扫描指定路径下的所有.apis(RequestHandlerSelectors.basePackage("com.example.demo")).paths(PathSelectors.any()).build();return docket;}
}

代码

Controller

package com.example.demo.business.user.controller;import com.example.demo.business.user.request.UserAddRequest;
import com.example.demo.business.user.request.UserEditRequest;
import com.example.demo.business.user.request.UserQueryRequest;
import com.example.demo.business.user.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;@Api(tags = "用户")
@RestController
@RequestMapping("/user")
public class UserController {@ApiOperation("添加")@PostMapping("/add")public UserVO add(@RequestBody @Valid UserAddRequest userAddRequest) {// 将数据写到数据库UserVO userVO = new UserVO();BeanUtils.copyProperties(userAddRequest, userVO);userVO.setId(1L);userVO.setCreateTime(LocalDateTime.now());userVO.setUpdateTime(LocalDateTime.now());return userVO;}@ApiOperation("修改")@PostMapping("/edit")public UserVO edit(@RequestBody @Valid UserEditRequest userEditRequest) {// 修改数据库的数据UserVO userVO = new UserVO();BeanUtils.copyProperties(userEditRequest, userVO);userVO.setUpdateTime(LocalDateTime.now());return userVO;}@ApiOperation("查找")@GetMapping("/find")public List<UserVO> find(UserQueryRequest userQueryRequest) {return new ArrayList<>();}@ApiOperation("删除")@PostMapping("/delete")public void delete(Long id) {// 将数据库数据删除}
}

Entity

说明

本处我将增删改查都单独写一个实体类。

当然,也可以将增删改的参数都写到一个实体里边,通过@Null,@NotNull以及它们的groups属性来指定属于哪个分组。这样写在运行时不会有问题,但在Knife4j页面显示时会不正常,原因是:Swagger没有很好地处理好这种情况。

添加

package com.example.demo.business.user.request;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotBlank;@Data
@ApiModel("添加用户")
public class UserAddRequest {@ApiModelProperty(value = "用户名", required = true)@NotBlank(message = "用户名不能为空")private String userName;@ApiModelProperty("昵称")private String nickName;@ApiModelProperty("邮箱")private String email;
}

修改

package com.example.demo.business.user.request;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;@Data
@ApiModel("修改用户")
public class UserEditRequest {@ApiModelProperty(value = "用户ID", required = true)@NotNull(message = "用户ID不能为空")private Long id;@ApiModelProperty(value = "用户名", required = true)@NotBlank(message = "用户名不能为空")private String userName;@ApiModelProperty("昵称")private String nickName;@ApiModelProperty("邮箱")private String email;
}

查询

package com.example.demo.business.user.request;import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDateTime;@Data
@ApiModel(value = "用户实体", description = "用户description")
public class UserQueryRequest {@ApiModelProperty("用户id")private Long id;@ApiModelProperty("用户名")private String userName;@ApiModelProperty("昵称")private String nickName;@ApiModelProperty("邮箱")private String email;@ApiModelProperty("创建时间")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;@ApiModelProperty("修改时间")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;
}

VO

package com.example.demo.business.user.vo;import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.time.LocalDateTime;@Data
@ApiModel(value = "用户实体", description = "用户description")
public class UserVO {@ApiModelProperty("用户id")private Long id;@ApiModelProperty("用户名")private String userName;@ApiModelProperty("昵称")private String nickName;@ApiModelProperty("邮箱")private String email;@ApiModelProperty(value = "创建时间")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;@ApiModelProperty(value = "修改时间")@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;@ApiModelProperty("删除标记。0:未删除 其他:已删除")private Long deletedFlag;
}

测试

knife4j跟Tomcat共用一个端口,默认Tomcat是8080。访问地址:

http://localhost:8080/doc.html

分组Url

“分组Url”是文档地址,其他软件(比如apifox)可以将它作为导入文档的url。

此网址可以直接访问:http://localhost:8080/v3/api-docs?group=all

文档

本处展示添加用户接口的文档:

自测

本处展示添加用户的自测方法

测试结果

问题解决

全局响应的处理

见:Knife4j--解决整合@ControllerAdvice时访问失败的问题_IT利刃出鞘的博客-CSDN博客

清缓存

见:Knife4j--清除缓存的方法_IT利刃出鞘的博客-CSDN博客

上传文件

见:Knife4j--解决不显示文件上传的问题_IT利刃出鞘的博客-CSDN博客

Knife4j系列--使用/教程/实例/配置相关推荐

  1. Swagger--使用/教程/实例/配置

    原文网址:Swagger--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客 简介 说明         本文用实例介绍Swagger的使用. Swagger是很常用的接口文档工具,在类和方法 ...

  2. 大疆 DJI mobile SDK系列详细教程——运行实例代码(跑通大疆官方提供Mobile SDK里的sample code)

    大疆 DJI mobile SDK系列详细教程--运行实例代码(跑通大疆官方提供Mobile SDK里的sample code) 文章目录 一.官方文献与资源地址 二.操作步骤 提示:昨天在尝试跑通大 ...

  3. Cisco 2950 系列交换机实例配置

    Cisco Catalyst 2950系列智能以太网交换机,提供卓越的性能.易使用性以及集成的Cisco IOS软件.它通过DSCP.WRR等保证先进的服务质量.同时,它具有限速(Rate-limit ...

  4. Oracle11g安装教程、配置实例、监听、客户端程序详解_Windows篇

    Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 文章目录 Oracle11g安装教程.配置实例.监听.客户端程序详解_Windows篇 前言 一.数据库的安装前准备,前提 ...

  5. QCC304x系列开发教程(实战篇)之4.2QCC3040之MDE按键导入配置

    查看全部教程开发请点击:高通蓝牙耳机QCC304x开发详解汇总(持续更新中) 查看本文全部文章请点击:QCC304x系列开发教程(实战篇)之4.2QCC3040之MDE按键导入配置 ========= ...

  6. C# 读取西门子S7系列PLC教程及源码

    创建 PLC 实例,连接和断开连接 若要创建驱动程序的实例,需要使用此构造函数: public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot) ...

  7. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

    Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 原文:Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台 转发请注明此文 ...

  8. java 配置信息_[Java教程]java 配置信息类 Properties 的简单使用

    [Java教程]java 配置信息类 Properties 的简单使用 0 2016-12-08 09:00:09 Properties :(配置信息类) 是一个表示持久性的集合 ,继承 Hashta ...

  9. nginx系列之三:日志配置

    ** 前言 ** nginx系列之一:nginx入门 nginx系列之二:配置文件解读 nginx系列之三:日志配置 nginx系列之四:web服务器 nginx系列之五: 负载均衡 nginx系列之 ...

最新文章

  1. 如何通过五个简单步骤成为更好的Stack Overflow用户
  2. 具有OpenCV和相似度测量的视频输入
  3. vue踩坑记-在项目中安装依赖模块npm install报错
  4. python pack属性_python tkinter基本属性详解
  5. simplified build configuration
  6. 量子计算机具有天热的,量子绝热计算
  7. 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  8. CVPR 2021 | 商汤提出最强时序动作提名修正网络:TCANet
  9. 关于ajax的content-download时间过慢问题的解决方案与思考
  10. pdf转图片文字丢失,字体映射替换
  11. ireader_使用iReader在Chrome和Firefox上获取Safari Reader
  12. 2022百度大数据开发工程师实习面试经历
  13. python——获取矩形四个角点的坐标
  14. 配对t检验的应用条件是什么_配对t检验在实际工作中的应用
  15. 前端剑法第三式————碎岩
  16. Smartbi数据报表系统,国内性价比最高的报表工具
  17. Android【WebView】
  18. ISP概述、工作原理及架构
  19. 【深度好文】香港富豪卧底贫民窟:“你没出息,是因为不努力”害了多少程序员
  20. 【论文泛读】Easing Embedding Learning by Comprehensive Transcription of Heterogeneous Information Networks

热门文章

  1. JavaScript--阻止冒泡与阻止默认
  2. vs2008无法安装
  3. 2017.9.15 android 屏蔽home按键
  4. Spring三种注入方法(set注入、构造方法注入、p标签注入)
  5. 编写LitmusRT调度器插件
  6. 别再吃各种维生素C片了,这6种维生素C含量最高的水果
  7. sequoiaDB连接mysql_SequoiaDB 巨杉数据库Docker镜像使用教程
  8. Havok物理引擎与Unity3D游戏的结合
  9. 储能虚拟同步机技术 上
  10. Java本地时间与GMT时间的转换