• Spring Boot 使用Knife4j


    Knife4j

    Knife4j是一款可以提供在线API文档的框架,是基于Swagger框架实现的。

    在Spring Boot项目中,使用Knife4j需要添加依赖knife4j-spring-boot-starter

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

    然后,需要添加配置,则在boot-demo项目的cn.tedu.boot.demo.config包下创建Knife4jConfig类:

    package cn.tedu.boot.demo.config;
    
    import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
    import org.springframework.beans.factory.annotation.Autowired;
    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.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
    
    @Configuration
    @EnableSwagger2WebMvc
    public class Knife4jConfig {
    
        /**
         * 【重要】指定Controller包路径
         */
        private String basePackage = "cn.tedu.boot.demo.controller";
        /**
         * 分组名称
         */
        private String groupName = "product";
        /**
         * 主机名
         */
        private String host = "http://java.tedu.cn";
        /**
         * 标题
         */
        private String title = "酷鲨商城在线API文档--商品管理";
        /**
         * 简介
         */
        private String description = "酷鲨商城在线API文档--商品管理";
        /**
         * 服务条款URL
         */
        private String termsOfServiceUrl = "http://www.apache.org/licenses/LICENSE-2.0";
        /**
         * 联系人
         */
        private String contactName = "Java教学研发部";
        /**
         * 联系网址
         */
        private String contactUrl = "http://java.tedu.cn";
        /**
         * 联系邮箱
         */
        private String contactEmail = "java@tedu.cn";
        /**
         * 版本号
         */
        private String version = "1.0.0";
    
        @Autowired
        private OpenApiExtensionResolver openApiExtensionResolver;
    
        @Bean
        public Docket docket() {
            String groupName = "1.0.0";
            Docket docket = new Docket(DocumentationType.SWAGGER_2)
                    .host(host)
                    .apiInfo(apiInfo())
                    .groupName(groupName)
                    .select()
                    .apis(RequestHandlerSelectors.basePackage(basePackage))
                    .paths(PathSelectors.any())
                    .build()
                    .extensions(openApiExtensionResolver.buildExtensions(groupName));
            return docket;
        }
    
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title(title)
                    .description(description)
                    .termsOfServiceUrl(termsOfServiceUrl)
                    .contact(new Contact(contactName, contactUrl, contactEmail))
                    .version(version)
                    .build();
        }
    
    }
    
    • 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

    注意:必须修改以上配置中的包名,保证是当前项目中控制器类所在的包!其它各项均可不修改,以上配置代码可以从Knife4j的官网找到!

    最后,还需要在配置文件中开启Knife4j的增强模式:

    # Knife4j配置
    knife4j:
      # 是否开启增强模式
      enable: true
    
    • 1
    • 2
    • 3
    • 4

    完成后,启动项目,在浏览器中访问 http://localhost:8080/doc.html 即可查看当前项目的API文档。

    在控制器类上添加@Api注解,并配置tags属性,可以指定模块名称,例如:

    @Api(tags = "管理员管理模块")  // 新增
    @RestController
    @RequestMapping(value = "/admins", produces = "application/json; charset=utf-8")
    public class AdminController {
        
        // ===== 原有其它代码 =====
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在处理请求的方法上添加@ApiOperation注解可以配置业务名称,例如:

    @ApiOperation("管理员登录") // 新增
    @PostMapping("/login")
    public JsonResult<AdminSimpleVO> login(@Validated AdminLoginDTO adminLoginDTO) {
        AdminSimpleVO adminSimpleVO = adminService.login(adminLoginDTO);
        return JsonResult.ok(adminSimpleVO);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当需要指定各业务在API文档中的显示顺序时,可以在处理请求的方法上添加@ApiOperationSupport注解,配置此注解的order属性,最终在显示API文档时,会根据order属性值升序排列,例如:

    @ApiOperation("管理员登录")
    @ApiOperationSupport(order = 900) // 新增
    @PostMapping("/login")
    public JsonResult<AdminSimpleVO> login(@Validated AdminLoginDTO adminLoginDTO) {
        AdminSimpleVO adminSimpleVO = adminService.login(adminLoginDTO);
        return JsonResult.ok(adminSimpleVO);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通常,建议以上配置的order值至少是2位的数字,并且有预留位置,例如1019之间的都是增加数据的业务,2029之间的都是删除数据的业务,3039之间都是修改数据的业务,4049之间都是查询数据的业务。

    如果控制器处理请求的方法的参数是自定义的封装类型,可以在封装类型的属性上添加@ApiModelProperty来配置参数在文档中的显示,例如:

    package cn.tedu.boot.demo.pojo.dto;
    
    
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    import javax.validation.constraints.NotNull;
    import java.io.Serializable;
    
    @Data
    public class AdminLoginDTO implements Serializable {
    
        @ApiModelProperty(value = "用户名") // 配置参数名
        private String username;
    
        @ApiModelProperty("密码") // 配置参数名
        private String password;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    以上@ApiModelProperty除了可以配置参数在API文档中显示的名称以外,还可以配置是否必须,例如:

    @ApiModelProperty(value = "用户名", required = true)
    
    • 1

    另外,还可以配置参数类型等,但是,并不是必须配置,通常框架可以正常自动识别。

    对于部分名称可能比较特殊(一般人直接看不懂)的属性,或者对值的规范性要求比较明确(例如某些取值为0或1)的属性,可以列举示例,使得查看API文档的人可以参考,例如:

    @ApiModelProperty(value = "用户名", required = true, example = "admin")
    
    • 1

    除以配置请求参数以外,此属性还可以用于响应结果的类型,例如:

    public class JsonResult<T> implements Serializable {
    
    
        @ApiModelProperty("业务状态码")
        private Integer state;
    
        @ApiModelProperty("消息")
        private String message;
    
        @ApiModelProperty("数据")
        private T data;
        
        // ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果以上private T data;的实际值也需要添加说明,则在对应的类的属性上继续使用@ApiModelProperty配置即可!需要注意:此处data属性可以是任意数据类型,必须声明为泛型,不可以是Object,否则将无法应用@ApiModelProperty的配置。

    另外,当添加在响应的类型的属性上时,还可以在@ApiModelProperty注解中配置position属性,用于设置各属性在响应的JSON中的显示顺序,例如:

    @ApiModelProperty(value = "业务状态码", position = 5)
    
    • 1
  • 相关阅读:
    如何在不依靠工资收入的情况下赚到一万元?
    2022杭电多校联赛第一场 题解
    Linux脚本:将.sh文件输出映射到日志文件并添加时间戳
    onnx模型转换到rknn脚本
    k8s部署kafka集群
    大数据技术之Zookeeper案例总结
    麒麟OS V10 设置开机自启动
    spring boot 一个极简单的 demo 示例
    Android 12(S) 图像显示系统 - 简述Allocator/Mapper HAL服务的获取过程(十五)
    考研算法题练习2022.11.13
  • 原文地址:https://blog.csdn.net/gezongbo/article/details/126264104