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文档:
在这里插入图片描述

### 如何在 Swagger 中使用 `@Content` 注解 `@Content` 注解主要用于描述 API 操作的响应体或请求体的内容结构。该注解通常与其他注解一起使用,比如 `@RequestBody` 或者 `@ApiResponse` 来定义具体的媒体类型以及对应的模式(schema)[^2]。 #### 定义响应内容 当希望为某个 HTTP 方法返回的数据指定具体格式时,可以通过 `@Content` 提供这些细节: ```java import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; // ... @ApiResponse(responseCode = "200", description = "Successful operation", content = @Content(mediaType = "application/json")) public ResponseEntity<User> getUserById(@PathVariable("id") Long id) { // method implementation... } ``` 上述例子展示了如何设置成功响应的状态码、说明文字及预期返回 JSON 数据类型的配置。 #### 结合 `@Schema` 描述复杂对象 对于复杂的业务实体类(如 User),还可以进一步利用 `@Schema` 对象来精确表达其内部字段的信息: ```java import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; // ... @ApiResponse(responseCode = "200", description = "Successfully retrieved user details.", content = @Content( mediaType = "application/json", schema = @Schema(implementation = User.class))) public ResponseEntity<User> getUserById(@PathVariable("id") Long id) { // method implementation... } ``` 这里不仅指定了 MIME 类型为 application/json ,还关联了一个 Java Bean (`User`) 的 Schema 表达方式给客户端展示完整的模型信息。 #### 处理多种可能的结果集 有时同一个接口可能会有不同形式的成功回复或者是错误提示,在这种情况下可以传递多个 `@Content` 实例到父级注解中去覆盖各种情况下的表现形态: ```java import java.util.Arrays; import org.springframework.http.ResponseEntity; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; //... @Operation(summary = "Create new users with the provided information.") @PostMapping("/users") @ApiResponse(responseCode = "201", description = "Created successfully.", content = {@Content(mediaType="application/json", array=@ArraySchema(schema=@Schema(implementation=User.class)))}) @ApiResponse(responseCode = "400", description = "Invalid input data.", content = @Content(mediaType = "application/json", schema = @Schema(type = "object"))) public ResponseEntity<String> createUser(@Valid @RequestBody(required=true, content=@Content(mediaType="application/json", schema=@Schema(implementation=NewUserRequest.class))) NewUserRequest newUser){ // Implementation here ... } ``` 这段代码片段显示了创建新用户的 POST 请求处理逻辑,并针对不同的状态码提供了相应的 Content 配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值