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 用户指南

相关推荐
SomeB1oody12 分钟前
【Rust自学】12.5. 重构 Pt.3:移动业务逻辑
开发语言·后端·重构·rust
Linux520小飞鱼26 分钟前
Perl语言的编程范式
开发语言·后端·golang
编程小筑29 分钟前
Perl语言的网络编程
开发语言·后端·golang
爱上语文30 分钟前
MyBatis——XML映射文件
xml·java·数据库·后端·mybatis
AI向前看31 分钟前
Perl语言的网络编程
开发语言·后端·golang
Camel卡蒙41 分钟前
Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
java·单例模式·设计模式
HYUJKI44 分钟前
懒汉式单例模式
java·开发语言·单例模式
工业甲酰苯胺1 小时前
方法引用与lambda底层原理&Java方法引用、lambda能被序列化么?
java·开发语言·linq
aiee1 小时前
mock服务-通过json定义接口自动实现mock服务
后端·golang
Cikiss1 小时前
图解Git——分支开发工作流《Pro Git》
git·后端·源代码管理