SpringBoot轻松实现项目集成Knife4j接口文档

Knife4j 介绍

Knife4j 官网

Knife4j是一款基于Swagger生成API文档的增强工具,它简化了开发者构建和管理RESTful API文档的过程。通过自动扫描项目中的接口信息,Knife4j能够生成详细、易读的API文档,无需手动编写和维护。它提供交互式的接口调试页面,方便验证接口正确性,同时支持接口聚合和分组,便于管理大型项目中的接口。此外,Knife4j还支持Markdown文档,以及定制化配置选项,使得API文档更加美观、灵活和易于展示。总体而言,Knife4j是一款功能强大的工具,能够提升API文档质量和开发效率,推动团队协作和沟通。

依赖引入

Knife4j其实就相当Swagger的升级版,相比于比Swagger要好用多了。

xml 复制代码
<!-- Knife4j -->
<dependency>
	<groupId>com.github.xiaoymin</groupId>
	<artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
	<version>4.0.0</version>
</dependency>

Knife4j 配置类

java 复制代码
package com.hsqyz.config.common;

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.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.ArrayList;
import java.util.List;

/**
 * Knife4j 配置
 */
@Configuration
@EnableSwagger2WebMvc // 开启Swagger
public class Knife4jConfiguration {

    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        return new Docket(DocumentationType.SWAGGER_2)
                // 是否启用Swagger
                .enable(true)
                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
                .apiInfo(new ApiInfoBuilder()
                        .title("API接口文档")
                		.description("API接口文档描述")
                        .termsOfServiceUrl("http://127.0.0.1:8080/")
                        // 联系方式(这里以本人邮箱为例)
                        .contact("1926585708@qq.com")
                        .version("1.0.0")
                        .build()
                )
                // 分组名称
                .groupName("default")
                // 设置哪些接口暴露给Swagger展示
                .select()
                // 这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.hsqyz.controller"))
                // 路径选择器
                .paths(PathSelectors.any())
                .build()
                /**
                 * 设置安全模式,swagger可以设置访问token
                 */
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts())
                .pathMapping("/");
    }

    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .build());
        return securityContexts;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }


}

版本说明

如果出现错误:

bash 复制代码
Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

图例问题

这里提供两种修复方案

降低Spring Boot 版本到2.6.x以下版本

比如下面版本组合是兼容的

Spring Boot版本 Swagger 版本
2.5.6 2.9.2
SpringBoot版本不降级解决方案

配置文件中加上:

properties 格式

bash 复制代码
spring.mvc.pathmatch.matching-strategy=ant_path_matcher

yaml 格式

yaml 复制代码
spring:  
  mvc:
    pathmatch:
      matching-strategy=ant_path_matcher

项目运行后,访问ip+端口号+/doc.html,比如:http://localhost:8080/doc.html

全局参数

在实际项目中访问接口都添加了权限,每次访问都要带一个请求头参数token。全局参数就是为了方便传一个固定的参数。当添加全局参数后,所有的接口都会带上该参数。


这里介绍2种设置全局参数的方法

第一种 【编码方式】

使用securitySchemes()securityContexts()来设置

引用代码

java 复制代码
/**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
    private List<SecurityScheme> securitySchemes() {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .build());
        return securityContexts;
    }

    /**
     * 默认的安全上引用
     */
    private List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

效果:菜单上多了一个Authorize,在参数值中添加上信息

刷新一下,再打开接口就会发现多了个请求头部

第二种 【手动配置全局参数】

直接在菜单文档管理全局参数设置,然后添加参数:

添加保存

再打开接口就会发现请求头参数加上了

过滤拦截说明

如果使用了安全相关的框架,例如(SaTokenSpringSecurity、包括手动定义的拦截器与过滤器),可能会拦截到Knife4j的文档接口,导致文档加载失败,需要手动放行这方面的接口

Apifox 一键导入 knife4j 接口文档

点击导入项目

选择Knife4j,填入地址后进行解析

解析出来的地址就是你的分组接口详细信息地址,点击提交即可

参考文章

Spring Boot项目集成Knife4j接口文档的实例代码
knife4j v2.0 用户指南

相关推荐
救救孩子把2 分钟前
Java基础之IO流
java·开发语言
flying jiang3 分钟前
Spring Boot 入门面试五道题
spring boot
小菜yh4 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.10 分钟前
Java键盘输入语句
java·开发语言
浅念同学10 分钟前
算法.图论-并查集上
java·算法·图论
希冀12311 分钟前
【操作系统】1.2操作系统的发展与分类
后端
立志成为coding大牛的菜鸟.23 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞24 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
GoppViper41 分钟前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文2 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring