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


    Knife4j 介绍

    Knife4j 官网

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

    依赖引入

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

    
    <dependency>
    	<groupId>com.github.xiaoymingroupId>
    	<artifactId>knife4j-openapi2-spring-boot-starterartifactId>
    	<version>4.0.0version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Knife4j 配置类

    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;
        }
    
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93

    版本说明

    如果出现错误:

    Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
    
    • 1

    图例问题

    这里提供两种修复方案

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

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

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

    配置文件中加上:

    properties 格式

    spring.mvc.pathmatch.matching-strategy=ant_path_matcher
    
    • 1

    yaml 格式

    spring:  
      mvc:
        pathmatch:
          matching-strategy=ant_path_matcher
    
    • 1
    • 2
    • 3
    • 4

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

    全局参数

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


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

    第一种 【编码方式】

    使用securitySchemes()securityContexts()来设置

    引用代码

    /**
         * 安全模式,这里指定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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

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

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

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

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

    添加保存

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

    过滤拦截说明

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

    Apifox 一键导入 knife4j 接口文档

    点击导入项目

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

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

    参考文章

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

  • 相关阅读:
    Vue组件详解
    基于Windows 的 VS Code C/C++ 编译环境搭建
    景联文科技:深度了解语音识别之发音词典及语音数据采集标注
    vue学习之事件绑定
    盒模型(非要让我凑满五个字标题)
    C语言编程陷阱(三)
    震惊,99.9% 的同学没有真正理解字符串的不可变性
    McDSP APB 16评测-终极的模拟处理器?
    Python中的枚举(enum)
    公司专利技术交底书撰写及申请完全流程
  • 原文地址:https://blog.csdn.net/qq_31762741/article/details/133034001