Spring Boot项目集成Knife4j接口文档的实例代码

作者:雨云21 时间:2022-09-20 13:24:27 

Knife4j就相当于是swagger的升级版,对于我来说,它比swagger要好用得多

1、在pom.xml引入依赖包


<!-- Swagger配置依赖knife4j -->
<dependency>
   <groupId>com.github.xiaoymin</groupId>
   <artifactId>knife4j-spring-boot-starter</artifactId>
   <version>2.0.9</version>
</dependency>

2、创建Knife4j配置文件


package com.yuyun.config;

import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
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.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

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

/**
* @author hyh
*/
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

@Bean(value = "defaultApi2")
   public Docket defaultApi2() {

Docket docket = new Docket(DocumentationType.SWAGGER_2)
               // 是否启用Swagger
               .enable(true)
               //分组名称
               .groupName("1.0版本")
               // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
               .apiInfo(apiInfo())
               // 设置哪些接口暴露给Swagger展示
               .select()
               // 扫描所有有注解的api,用这种方式更灵活
               .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
               //指定Controller扫描包路径
//                .apis(RequestHandlerSelectors.basePackage("com.yuyun.controller"))
               // 扫描所有
//                .apis(RequestHandlerSelectors.any())
               .build();
       return docket;
   }

private ApiInfo apiInfo() {

String name = "雨云";
       String url = "https://www.xxx.com/";
       String email = "1873591403@qq.com";

Contact contact = new Contact(name, url, email);

return new ApiInfoBuilder()
               .title("API接口文档")
               .description("API接口文档描述")
               .termsOfServiceUrl("https://www.xx.com/")
               .contact(contact)
               .version("1.0.1")
               .build();
   }
}

注意:如果出现错误Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

Spring Boot项目集成Knife4j接口文档的实例代码

是因为SpringBoot版本高了,将版本降下去或者在application.yml添加如下内容即可解决该错误


spring:
 mvc:
   pathmatch:
     matching-strategy: ant_path_matcher

项目运行后,访问ip+端口号+/doc.html,比如http://localhost:8110/doc.html。效果如图

Spring Boot项目集成Knife4j接口文档的实例代码

3、使用Knife4j注解

(1)在实体类中使用

@ApiModel 放在在响应实体类上,用于描述该类

@ApiModelProperty 描述该响应类的属性


/**
* 企业信息表
*
* @author  
* @since 1.0.0 2021-12-17
*/
@Data
@ApiModel(value = "企业信息表")
@TableName("company")
public class CompanyDTO implements Serializable {
   private static final long serialVersionUID = 1L;

/**
* 主键
*/
@ApiModelProperty(value = "主键")
private Long id;

/**
* 企业名称
*/
@ApiModelProperty(value = "企业名称")
private String companyName;

/**
* 简介
*/
@ApiModelProperty(value = "简介")
private String description;
}

Spring Boot项目集成Knife4j接口文档的实例代码

(2)在Controller层使用


@RestController
@RequestMapping("company")
@Api(tags = "企业信息表")
public class CompanyController {
   @Autowired
   private CompanyService companyService;

@GetMapping("getList")
   @ApiOperation("根据条件获取数据")
   @ApiImplicitParams({
           @ApiImplicitParam(name = "id", value = "id", paramType = "query", required = true, dataType = "String"),
           @ApiImplicitParam(name = "name", value = "名称", paramType = "query", required = true, dataType = "String")
   })
   public Result<List<CompanyDTO>> getList(@ApiParam(name = "address", value = "地址", required = true)  String address) {
       List<CompanyDTO> companyList = companyService.list();

return new Result<List<CompanyDTO>>().success(companyList);
   }
}

还有其他一些注解,用到再了解

4、全局参数

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

第一种

在配置文件中加入


private List<SecurityScheme> securitySchemes() {
   List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
   apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
   return apiKeyList;
}

defaultApi2()方法内引用


.securitySchemes(securitySchemes())

最后配置文件中的内容:


@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

@Bean(value = "defaultApi2")
   public Docket defaultApi2() {

Docket docket = new Docket(DocumentationType.SWAGGER_2)
               // 是否启用Swagger
               .enable(true)
               //分组名称
               .groupName("1.0版本")
               // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
               .apiInfo(apiInfo())
               // 设置哪些接口暴露给Swagger展示
               .select()
               // 扫描所有有注解的api,用这种方式更灵活
               .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
               //指定Controller扫描包路径
//                .apis(RequestHandlerSelectors.basePackage("com.yuyun.controller"))
               // 扫描所有
//                .apis(RequestHandlerSelectors.any())
               .paths(PathSelectors.any())
               .build()
               /* 设置安全模式,swagger可以设置访问token */
               .securitySchemes(securitySchemes())
               .securityContexts(securityContexts())
               .pathMapping("/");
       return docket;
   }

private ApiInfo apiInfo() {

String name = "雨云";
       String url = "https://www.xxx.com/";
       String email = "1873591403@qq.com";

Contact contact = new Contact(name, url, email);

return new ApiInfoBuilder()
               .title("API接口文档")
               .description("API接口文档描述")
               .termsOfServiceUrl("https://www.xx.com/")
               .contact(contact)
               .version("1.0.1")
               .build();
   }

/**
    * 安全模式,这里指定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,在参数值中添加上信息

Spring Boot项目集成Knife4j接口文档的实例代码

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

Spring Boot项目集成Knife4j接口文档的实例代码

第二种

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

Spring Boot项目集成Knife4j接口文档的实例代码

Spring Boot项目集成Knife4j接口文档的实例代码

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

Spring Boot项目集成Knife4j接口文档的实例代码

源码地址:https://gitee.com/hyh17808770899/spring-boot/tree/master/springboot-03

来源:https://blog.csdn.net/hyh17808770899/article/details/122112034

标签:Spring,Boot,Knife4j,接口文档
0
投稿

猜你喜欢

  • java9版本特性资源自动关闭的语法增强

    2023-10-30 23:35:24
  • Android特效之水波纹的实现

    2022-04-30 22:55:09
  • IDEA设置maven修改settings.xml配置文件无法加载仓库的解决方案

    2023-08-23 22:39:35
  • spring boot配置ssl实现HTTPS的方法

    2022-03-27 01:27:49
  • Gradle的基本使用

    2023-05-29 00:08:42
  • 教你怎么用java一键自动生成数据库文档

    2021-08-01 02:34:36
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(二)

    2022-11-14 18:37:22
  • Android第三方开源下拉框NiceSpinner使用详解

    2023-01-04 11:10:29
  • Android中使用Gson解析JSON数据的两种方法

    2021-10-13 23:25:39
  • 深入理解C#之枚举

    2023-01-02 14:08:33
  • Java Map接口及其实现类原理解析

    2022-06-04 22:54:29
  • 浅谈RecyclerView(完美替代ListView,GridView)

    2022-12-08 06:54:20
  • 常见的排序算法,一篇就够了

    2022-06-16 06:56:34
  • 利用java实现邮箱群发功能

    2021-07-11 21:55:23
  • Android按钮按下的时候改变颜色实现方法

    2021-09-24 20:15:39
  • 详解Android四种存储方式

    2022-06-26 21:51:35
  • Java并发编程之线程创建介绍

    2021-11-14 13:55:40
  • C#如何获取枚举的描述属性详解

    2023-02-23 13:49:59
  • IntelliJ IDEA中查看当前类的所有继承关系图

    2023-08-06 12:40:19
  • 详解JAVA Spring 中的事件机制

    2022-01-13 05:26:33
  • asp之家 软件编程 m.aspxhome.com