Swagger3学习笔记

一、简介

Swagger是一个简单但功能强大的API表达工具。使用Swagger生成API,
我们可以得到交互式文档,自动生成代码的SDK以及API的发现特性等。
swagger官网
swagger在线编辑器

二、SpringBoot集成Swagger3

步骤:

1、新建springboot项目
2、导入swagger依赖Maven

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

这里用的是 springfox,Swagger 可以看作是一个遵循了 OpenAPI 规范的一项技术,而 springfox 则 是这项技术的具体实现。

3、开启swagger,在springboot启动类中添加@EnableOpenApi注解

@SpringBootApplication
@EnableOpenApi
public class SwaggerDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SwaggerDemoApplication.class, args);
    }
}

4、创建一个测试controller

@RestController
public class HelloController {
    @GetMapping(value = "/hello")
    public String hello(){
        return "hello";
    }
}

启动项目测试
在这里插入图片描述
注意:
springboot2.6.X启动项目会报Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException。
原因是:Springfox使用的路径匹配是基于AntPathMatcher的,而Spring Boot 2.6.X使用的是PathPatternMatcher。
解决办法: 在application.yml中添加以下配置

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

5、访问swagger接口文档 http://localhost:8080/swagger-ui/
在这里插入图片描述
6、展开HelloWorldController接口定义
在这里插入图片描述
展开hello接口
在这里插入图片描述
点击Try it out
在这里插入图片描述

三、Swagger3 常用注解

1.@Api

说明:用在处理类上,表示对类的说明
常用属性:

  • tags:描述该类的作用

2.@ApiOperation

说明:用在请求的方法上,说明方法的作用和备注
常用属性:

  • value:描述方法的作用
  • notes:备注说明

3.@ApiImplicitParams

说明:用在请求的方法上,表示一组参数说明

常用属性:

  • @ApiImplicitParams
    说明:定义参数各项信息
    常用属性:
    • name:参数名称
    • value:参数说明
    • required:是否必传,值为Boolean类型
    • paramType:参数放在哪个地方,常用值为:query(放在请求参数中,@RequestParam获取参数)、header(放在请求头中,@RequestHeader获取参数)、path(用于restful接口,@PathVariable获取参数)
    • dataType:参数类型,默认String
    • defaultValue:参数的默认值

4.@ApiResponses

说明:用在请求的方法上,表示一组响应
常用属性:

  • @ApiResponse
    说明:一般用于表达一个错误的响应信息
    常用属性:
    • code:响应码
    • message:响应信息
    • response:抛出异常的类

5.@ApiModel

说明:用于响应类上,描述响应的数据对象

6.@ApiModelProperty

说明:用在JavaBean属性上,描述响应类的属性或请求类的属性
常用属性:

  • name:参数名称
  • value:参数说明
  • required:是否必传,值为Boolean类型
  • dataType:参数类型,默认String

示例一:@Api、@ApiOperation

@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
    @ApiOperation(value = "hello接口", notes = "<h1>这是备注说明</h1>")
    @GetMapping(value = "/hello")
    public String Description() {
        return "hello";
    }
}

在这里插入图片描述

示例二:@ApiImplicitParams

@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
    @PostMapping(value = "/findInfo")
    @ApiOperation(value = "查询信息", notes = "<h1>这是备注说明</h1>")
    @ApiImplicitParams(value = {
        @ApiImplicitParam(name = "value", value = "值", required = true, paramType = "query"),
        @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query", dataType = "Integer")
    })
    public String findInfo(String value, Integer id) {
        return value + "====" + id;
    }
}

在这里插入图片描述

示例三:@ApiResponses、@ApiModel、@ApiModelProperty

@RestController
@Api(tags = "Hello测试处理器")
public class HelloController {
    @GetMapping("/getStudent/{id}")
    @ApiOperation(value = "获取学生信息", notes = "<h1>这是备注说明</h1>")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "path", dataType = "Integer")
    })
    @ApiResponses({
        @ApiResponse(code = 600, message = "业务错误"),
        @ApiResponse(code = 404, message = "找不到路径"),
        @ApiResponse(code = 400, message = "参数错误"),
        @ApiResponse(code = 500, message = "程序错误")
    })
    public Student getStudent(@PathVariable("id") Integer id) {
        Student student = new Student();
        student.setId(id);
        student.setName("张三");
        student.setAge(25);
        student.setEmail("qwe@123");
        return student;
    }
}

Student.java

@ApiModel("学生实体信息")
public class Student {
    @ApiModelProperty(name = "id", value = "编号", dataType = "Integer")
    private Integer id;

    @ApiModelProperty(name = "name", value = "姓名", required = true, dataType = "String")
    private String name;

    @ApiModelProperty(name = "age", value = "年龄", required = true, dataType = "Integer")
    private Integer age;

    @ApiModelProperty(name = "email", value = "邮箱", required = true, dataType = "String")
    private String email;
}

在这里插入图片描述

四、API信息配置

默认情况,显示的API信息如下
在这里插入图片描述
修改默认配置,可以新建一个Java Config重写ApiConfig以及Docket来实现

@Configuration
public class Swagger3Config {
    /**
     * 配置Docket
     * @return
     */
    @Bean
    public Docket createDocket() {
        return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
            .apiInfo(createApiInfo());
    }

    /**
     * 配置Docket
     * @return
     */
    @Bean
    public ApiInfo createApiInfo() {
        return new ApiInfo(
            "CK Swagger Document",
            "CK API Document",
            "0.0.1",
            "urn:tos",
            new Contact("CK", "http://localhost:8080/", "123456@163.com"),
            "Apache 2.0",
            "http://www.apache.org/licenses/LICENSE-2.0",
            new ArrayList<>()
        );
    }
}

通过ApiInfo源码查看构造参数

public ApiInfo(String title, String description, String version, String termsOfServiceUrl, Contact contact, String license, String licenseUrl, Collection<VendorExtension> vendorExtensions) {
    this.title = title;
    this.description = description;
    this.version = version;
    this.termsOfServiceUrl = termsOfServiceUrl;
    this.contact = contact;
    this.license = license;
    this.licenseUrl = licenseUrl;
    this.vendorExtensions = new ArrayList(vendorExtensions);
}

在这里插入图片描述

五、Docket 开关&过滤&分组配置

通过设置Docket,可以配置很多功能,比如是否开启swagger,过滤,分组等;

1.Docket开关设置

一般情况,只有在开发环境才会用到swagger,正式环境需要关闭swagger,一个是安全问题,还有一个是用了swagger会影响系统运行速度;

通过配置Docket对象的enable方法实现swagger启用和禁用

/**
     * 配置Docket
     * @return
     */
@Bean
public Docket createDocket() {
    return new Docket(DocumentationType.OAS_30)
        .apiInfo(createApiInfo())
        .enable(false);
}

重启后在访问,可以看到已经被禁用了
在这里插入图片描述

2.设置过滤API

有些情况,我们需要指定包路径下的类生成API,或者根据前端用户路径请求过滤;
使用过滤要调用select()方法,select()方法有两种方法实现过滤:
1、根据包路径来扫描指定类的API
具体示例:

/**
     * 配置Docket
     * @return
     */
@Bean
public Docket createDocket() {
    return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
        .apiInfo(createApiInfo())
        .enable(true)
        //设置过滤
        .select()
        //RequestHandlerSelectors.basePackage()设置包路径来扫描指定类的API;any() 方法是默认所有都有效, none()方法都无效;withClassAnnotation()根据类注解, withMethodAnnotation()是根据方法注解;
        .apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test1"))
        //最后加build()方法
        .build();
}

2、根据请求路径来扫描API
具体示例:

/**
     * 配置Docket
     * @return
     */
@Bean
public Docket createDocket() {
    return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
        .apiInfo(createApiInfo())
        .enable(true)
        //设置过滤
        .select()
        //PathSelectors.ant()设置匹配路径;any()是匹配任意路径, none()是都不匹配, regex()是正则匹配;
        .paths(PathSelectors.ant("/test1/**"))
        .build();
}

3.设置分组

在实际项目开发中,把复杂项目划分多模块给多个小组或者多个人负责开发,所以每个小组或者个人要 实现自己的分组,方便查找到API接口开发负责人,沟通和处理问题;

通过配置Docket对象的groupName方法设置组名;

/**
     * 配置Docket
     * @return
     */
@Bean
public Docket createDocket() {
    return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
        .apiInfo(createApiInfo())
        .enable(true)
        .groupName("Group A");
}

重启项目,默认组名改为了Group A
在这里插入图片描述

配置多个组

在controller包下创建两个子包并创建Controller,模拟两个模块
在这里插入图片描述
在Swagger3配置类中配置两个Docket和ApiInfo,通过Docket对象的apis方法为每个组扫描指定包下的API;
具体代码:

package com.example.swaggerdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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 java.util.ArrayList;

@Configuration
public class Swagger3Config {
    /**
     * 配置DocketA
     * @return
     */
    @Bean
    public Docket createDocketA() {
        return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
            .apiInfo(createApiInfoA())
            .enable(true)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test1"))
            .build()
            .groupName("Group A");
    }

    /**
     * 配置DocketB
     * @return
     */
    @Bean
    public Docket createDocketB() {
        return new Docket(DocumentationType.OAS_30) // 指定swagger3.0版本
            .apiInfo(createApiInfoB())
            .enable(true)
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.swaggerdemo.controller.test2"))
            .build()
            .groupName("Group B");
    }

    /**
     * 配置ApiInfoA
     * @return
     */
    @Bean
    public ApiInfo createApiInfoA() {
        return new ApiInfo(
            "CK GroupA Swagger Document",
            "CK API Document",
            "0.0.1",
            "urn:tos",
            new Contact("CK", "http://localhost:8080/", "123456@163.com"),
            "Apache 2.0",
            "http://www.apache.org/licenses/LICENSE-2.0",
            new ArrayList<>()
        );
    }

    /**
     * 配置ApiInfoB
     * @return
     */
    @Bean
    public ApiInfo createApiInfoB() {
        return new ApiInfo(
            "CK Swagger Document",
            "CK GroupB API Document",
            "0.0.1",
            "urn:tos",
            new Contact("CK", "http://localhost:8080/", "123456@163.com"),
            "Apache 2.0",
            "http://www.apache.org/licenses/LICENSE-2.0",
            new ArrayList<>()
        );
    }
}

重启项目
在这里插入图片描述
组Group A的API文档:
在这里插入图片描述
组Group B的API文档:
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值