knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。

knife4j的前身是swagger-bootstrap-ui,为了契合微服务的架构发展,由于原来swagger-bootstrap-ui采用的是后端Java代码 前端Ui混合打包的方式,在微服务架构下显的很臃肿,因此项目正式更名为knife4j。 knife4j官方网址:knife4j

一、引入依赖

Knife4J 官网:

https://doc.xiaominfo.com/
快速开始:https://doc.xiaominfo.com/docs/quick-start
<!--引入Knife4j的官方start包,Swagger2基于Springfox2.10.5项目-->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <!--使用Swagger2-->
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.9</version>
</dependency>

二、创建配置类

创建config包,在其中新建一个配置类:

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {

    @Bean(value = "dockerBean")
    public Docket dockerBean() {
        //指定使用Swagger2规范
        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                //描述字段支持Markdown语法
                .description("# 写一个简要的描述")
                .termsOfServiceUrl("https://doc.xiaominfo.com/")
                .contact("可以写作者的信息")
                .version("1.0")
                .build())
                //分组名称
                .groupName("用户服务")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.xueou.boot.controller"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }
}
  • 最重要的配置还是:指定
  • Controller扫描包路径contact

官方是弃用了直接传字符串的这个设置方法,改用传入一个Contact类,看一下源码可以发现该类的结构(内容更丰富了:姓名、邮箱、URL连接)

三、常用注解

3-1 @Api

@Api 注解,添加在 Controller 类上,标记它作为 Swagger 文档资源。

3-1-1 @Api 注解的常用属性,如下:

  • tags 属性:用于控制 API 所属的标签列表。[] 数组,可以填写多个。
  • 可以在一个 Controller 上的 @Apitags 属性,设置多个标签,那么这个 Controller 下的 API 接口,就会出现在这两个标签中。
  • 如果在多个 Controller 上的 @Apitags 属性,设置一个标签,那么这些 Controller 下的 API 接口,仅会出现在这一个标签中。
  • 本质上,tags 就是为了分组 API 接口,和 Controller 本质上是一个目的。所以绝大数场景下,我们只会给一个 Controller 一个唯一的标签。

3-1-2 @Api 注解的不常用属性,如下:

  • produces 属性:请求请求头的可接受类型( Accept )。如果有多个,使用 , 分隔。
  • consumes 属性:请求请求头的提交内容类型( Content-Type )。如果有多个,使用 , 分隔。
  • protocols 属性:协议,可选值为 “http”、“https”、“ws”、“wss” 。如果有多个,使用 , 分隔。
  • authorizations 属性:授权相关的配置,[] 数组,使用 @Authorization 注解。hidden 属性:是否隐藏,不再 API 接口文档中显示。

@Api 注解的废弃属性,不建议使用,有 value、description、basePath、position 。

3-2 @ApiOperation

@ApiOperation 注解,添加在 Controller 方法上,标记它是一个 API 操作。

3-2-1 @ApiOperation 注解的常用属性,如下:

  • value 属性:API 操作名。
  • notes 属性:API 操作的描述。

3-2-2 @ApiOperation 注解的不常用属性,如下:

  • tags 属性:和 @API 注解的 tags 属性一致。
  • nickname 属性:API 操作接口的唯一标识,主要用于和第三方工具做对接。
  • httpMethod 属性:请求方法,可选值为 GET、HEAD、POST、PUT、DELETE、OPTIONS、PATCH 。因为 Swagger 会解析 SpringMVC 的注解,所以一般无需填写。
  • produces 属性:和 @API 注解的 produces 属性一致。
  • consumes 属性:和 @API 注解的 consumes 属性一致。
  • protocols 属性:和 @API 注解的 protocols 属性一致。
  • authorizations 属性:和 @API 注解的 authorizations 属性一致。
  • hidden 属性:和 @API 注解的 hidden 属性一致。
  • response 属性:响应结果类型。因为 Swagger 会解析方法的返回类型,所以一般无需填写。
  • responseContainer 属性:响应结果的容器,可选值为 List、Set、Map 。
  • responseReference 属性:指定对响应类型的引用。这个引用可以是本地,也可以是远程。并且,当设置了它时,会覆盖 response 属性。说人话,就是可以忽略这个属性,哈哈哈。responseHeaders 属性:响应头,[] 数组,使用 @ResponseHeader 注解。
  • code 属性:响应状态码,默认为 200 。
  • extensions 属性:拓展属性,[] 属性,使用 @Extension 注解。
  • ignoreJsonView 属性:在解析操作和类型,忽略 JsonView 注释。主要是为了向后兼容。

@ApiOperation 注解的废弃属性,不建议使用,有 position 。

3-3 @ApiImplicitParam

@ApiImplicitParam 注解,添加在 Controller 方法上,声明每个请求参数的信息。

3-3-1 @ApiImplicitParam 注解的常用属性,如下:

  • name 属性:参数名。
  • value 属性:参数的简要说明。
  • required 属性:是否为必传参数。默认为 false 。
  • dataType 属性:数据类型,通过字符串 String 定义。
  • dataTypeClass 属性:数据类型,通过 dataTypeClass 定义。在设置了dataTypeClass 属性的情况下,会覆盖 dataType 属性。推荐采用这个方式。
  • paramType 属性:参数所在位置的类型。有如下 5 种方式:

"path" 值:对应 SpringMVC 的 @PathVariable 注解。
【默认值】"query" 值:对应 SpringMVC 的 @PathVariable 注解。
"body" 值:对应 SpringMVC 的 @RequestBody 注解。
"header" 值:对应 SpringMVC 的 @RequestHeader 注解。
"form" 值:Form 表单提交,对应 SpringMVC 的 @PathVariable 注解。
绝大多数情况下,使用 “query” 值这个类型即可。

  • example 属性:参数值的简单示例。
  • examples 属性:参数值的复杂示例,使用 @Example 注解。

3-3-2 @ApiImplicitParam 注解的不常用属性,如下:

  • defaultValue 属性:默认值。
  • allowableValues 属性:允许的值。如果要设置多个值,有两种方式:

数组方式,即 {value1, value2, value3} 。例如说,{1, 2, 3} 。
范围方式,即 [value1, value2][value1, value2) 。例如说 [1, 5] 表示 1 到 5 的所有数字。如果有无穷的,可以使用 (-infinity, value2][value1, infinity)

  • allowEmptyValue 属性:是否允许空值。
  • allowMultiple 属性:是否允许通过多次传递该参数来接受多个值。默认为 false 。
  • type 属性:搞不懂具体用途,对应英文注释为 Adds the ability to override the detected type 。
  • readOnly 属性:是否只读。
  • format 属性:自定义的格式化。
  • collectionFormat 属性:针对 Collection 集合的,自定义的格式化。

当我们需要添加在方法上添加多个 @ApiImplicitParam 注解时,可以使用 @ApiImplicitParams 注解中添加多个。

3-4 @ApiModel

@ApiModel 注解,添加在 POJO 类,声明 POJO 类的信息。而在 Swagger 中,把这种 POJO 类称为 Model 类。所以,我们下文就统一这么称呼。

3-4-1 @ApiModel 注解的常用属性,如下:

  • value 属性:Model 名字。
  • description 属性:Model 描述。

3-4-2 @ApiModel 注解的不常用属性,如下:

  • parent 属性:指定该 Model 的父 Class 类,用于继承父 Class 的 Swagger 信息。
  • subTypes 属性:定义该 Model 类的子类 Class 们。
  • discriminator 属性:搞不懂具体用途,对应英文注释为 Supports model inheritance and polymorphism.
  • reference 属性:搞不懂具体用途,对应英文注释为 Specifies a reference to the corresponding type definition, overrides any other metadata specified

3-5 @ApiModelProperty

  • @ApiModelProperty 注解,添加在 Model 类的成员变量上,声明每个成员变量的信息。

3-5-1 @ApiModelProperty 注解的常用属性,如下:

  • value 属性:属性的描述。
  • dataType 属性:和 @ApiImplicitParam 注解的 dataType 属性一致。不过因为 @ApiModelProperty 是添加在成员变量上,可以自动获得成员变量的类型。
  • required 属性:和 @ApiImplicitParam 注解的 required 属性一致。
  • example 属性:@ApiImplicitParam 注解的 example 属性一致。

3-5-2 @ApiModelProperty 注解的不常用属性,如下:

  • name 属性:覆盖成员变量的名字,使用该属性进行自定义。
  • allowableValues 属性:和 @ApiImplicitParam 注解的 allowableValues 属性一致。
  • position 属性:成员变量排序位置,默认为 0 。
  • hidden 属性:@ApiImplicitParam 注解的 hidden 属性一致。
  • accessMode 属性:访问模式,有 AccessMode.AUTO、AccessMode.READ_ONLY、AccessMode.READ_WRITE 三种,默认为 AccessMode.AUTO 。
  • reference 属性:和 @ApiModel 注解的 reference 属性一致。
  • allowEmptyValue 属性:和 @ApiImplicitParam 注解的 allowEmptyValue 属性一致。
  • extensions 属性:和 @ApiImplicitParam 注解的 extensions 属性一致。

@ApiModelProperty 注解的废弃属性,不建议使用,有 readOnly 。

3-6 @ApiResponse

在大多数情况下,我们并不需要使用 @ApiResponse 注解,因为我们会类似 UserController#get(id) 方法这个接口,返回一个 Model 即可。

  • @ApiResponse 注解,添加在 Controller 类的方法上,声明每个响应参数的信息。
  • @ApiResponse 注解的属性,基本已经被 @ApiOperation 注解所覆盖,如下:
  • message 属性:响应的提示内容。
  • code 属性:和 @ApiOperation 注解的 code 属性一致。
  • response 属性:和 @ApiOperation 注解的 response 属性一致。
  • reference 属性:和 @ApiOperation 注解的 responseReference 属性一致。
  • responseHeaders 属性:和 @ApiOperation 注解的 responseHeaders 属性一致。
  • responseContainer 属性:和 @ApiOperation 注解的 responseContainer 属性一致。
  • examples 属性:和 @ApiOperation 注解的 examples 属性一致。

当我们需要添加在方法上添加多个 @ApiResponse 注解时,可以使用 @ApiResponses 注解中添加多个。

四、配置JavaBean

主要用于返回参数、或是接收参数的时候进行说明。

@Getter
@Setter
@ToString
@NoArgsConstructor
@ApiModel(value = "轮播图对象", description = "")
public class Banner implements Serializable {
    @ApiModelProperty(value = "id", example = "1")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "图像链接", example = "https://xxx/xxx.png")
    private String imgUrl;
    @ApiModelProperty(value = "标题", example = "这是一个标题哟~")
    private String title;
}

我自己用的时候,又封装了一层,设置了几个JavaBean用于包装返回的响应结果:

分别用于返回单个数据、数据列表,同时附带上状态码和说明信息。

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public abstract class RBean {
    @ApiModelProperty(value = "响应码",
            position = 0,
            example = "200",
            notes = "200: 成功;500:失败;")
    private Integer code;
    @ApiModelProperty(value = "响应说明", position = 1, example = "xx数据获取成功。")
    private String msg;
}

// =====================
@EqualsAndHashCode(callSuper=true)
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class ROneBean<T> extends RBean {

    @ApiModelProperty(value = "数据项", position = 2)
    private T data;
}

// =======================
@EqualsAndHashCode(callSuper=true)
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RListBean<T> extends RBean{
    @ApiModelProperty(value = "数据列表", position = 2)
    private List<T> data;
}

五、配置Controller

潦草的写几个接口

@Api(tags = "首页模块")
@RestController
public class IndexController {
    @Resource
    IBannerService iBannerService;

    @ApiOperation(value = "域名直接转接口文档", hidden = true)
    @GetMapping("/")
    public void toDoc(HttpServletResponse response) throws IOException {
        response.sendRedirect("/doc.html");
    }
    
    @ApiOperation("新增轮播图数据")
    @PostMapping("/addBanners")
    public void putBanner(@RequestBody Banner banner){
		// ......
    }
    
    @ApiOperation("查询一个具体轮播图")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "title",value = "标题",required = true,example = "小白菜"),
            @ApiImplicitParam(name = "date",value = "时间",required = true,example = "2022")
    })
    @GetMapping("/searchOneBanner")
    public ROneBean<Banner> searchOneBanner(@RequestParam(name = "title",defaultValue = "") String name,
                                           @RequestParam(name = "date", defaultValue = "") String address){
        ROneBean<Banner> resp = new ROneBean<>();
        // ...
        return null
    }

    @ApiOperation("获取轮播图数据")
    @GetMapping("/getBanners")
    public RListBean<Banner> getBanners(){
        RListBean<Banner> resp = new RListBean<>();
        List<Banner> banners = iBannerService.list();
        if(banners.isEmpty()){
            resp.setCode(200);
            resp.setMsg("轮播图数据为空。");
        }else{
            resp.setCode(200);
            resp.setMsg("获取轮播图数据成功");
            resp.setData(banners);
        }
        return resp;
    }
}

六、接口文档预览

到此这篇关于SpringBoot中使用Knife4J的文章就介绍到这了,更多相关SpringBoot 使用Knife4J内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

SpringBoot中使用Knife4J的解决方案的更多相关文章

  1. SpringBoot本地磁盘映射问题

    这篇文章主要介绍了SpringBoot本地磁盘映射问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源)

    这篇文章主要介绍了java SpringBoot 分布式事务的解决方案(JTA+Atomic+多数据源),文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

  3. SpringBoot整合Javamail实现邮件发送的详细过程

    日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等,下面这篇文章主要给大家介绍了关于SpringBoot整合Javamail实现邮件发送的详细过程,需要的朋友可以参考下

  4. SpringBoot详细讲解视图整合引擎thymeleaf

    这篇文章主要分享了Spring Boot整合使用Thymeleaf,Thymeleaf是新一代的Java模板引擎,类似于Velocity、FreeMarker等传统引擎,关于其更多相关内容,需要的小伙伴可以参考一下

  5. Springboot集成mybatis实现多数据源配置详解流程

    在日常开发中,若遇到多个数据源的需求,怎么办呢?通过springboot集成mybatis实现多数据源配置,简单尝试一下,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. SpringBoot使用Minio进行文件存储的实现

    本文主要介绍了SpringBoot使用Minio进行文件存储的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. 解析SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    这篇文章主要介绍了SpringBoot中使用LoadTimeWeaving技术实现AOP功能,AOP面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强,本文给大家介绍的非常详细,需要的朋友可以参考下

  8. 详解springboot测试类注解

    这篇文章主要介绍了springboot测试类注解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. SpringBoot实现过滤器和拦截器的方法

    大家应该都晓得实现过滤器需要实现 javax.servlet.Filter 接口,而拦截器会在处理指定请求之前和之后进行相关操作,配置拦截器需要两步,本文通过实例代码给大家介绍SpringBoot 过滤器和拦截器的相关知识,感兴趣的朋友一起看看吧

  10. SpringBoot中使用@scheduled定时执行任务的坑

    本文主要介绍了SpringBoot中使用@scheduled定时执行任务的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部