我不生产代码
我只是代码的搬运工

Springboot 2.6.3 整合 Swagger3

1. 引入依赖

Swagger3 中不需要引入依赖springfox-swagger2springfox-swagger-ui,只需要引入依赖 springfox-boot-starter 即可,因为 springfox-boot-starter 依赖已将 springfox-swagger2springfox-swagger-ui 引入,通过下面代码引入 Swagger3 依赖:

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

2. 自定义配置swagger

package com.qing.config;

@Configuration
@EnableOpenApi
public class SwaggerConfig {
}

上面配置完成后,运行时会有如果报错:

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

Springboot2.6 中将 SpringMVC 默认路径匹配策略从 AntPathMatcher 更改为 PathPatternParser,所以需要在 application.yml 文件中添加如下配置即可:

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

Swagger3 完整配置

package com.qing.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.oas.annotations.EnableOpenApi;
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 //配置类
@EnableOpenApi
public class SwaggerConfig {

    @Bean
    public Docket getDocket() {
        Docket docket = new Docket(DocumentationType.OAS_30);
        docket.apiInfo(getApiInfo());
        // RequestHandlerSelectors.basePackage 指定包下文件开启 swagger
        // RequestHandlerSelectors.any() 所以包下文件开启 swagger
        // RequestHandlerSelectors.none() 所有包下文件都不开启 swagger
        // RequestHandlerSelectors.withClassAnnotation() 扫描有指定注解的类
        docket.select().apis(RequestHandlerSelectors.basePackage("com.qing.controller.swagger")).build();

        // PathSelectors.ant() 扫描指定目录下的文件
        // PathSelectors.any() 扫描所有文件
        // PathSelectors.none() 所有文件都不扫描
        // PathSelectors.regex() 按正则方式扫描文件
        docket.select().paths(PathSelectors.ant("/qing/**")).build();
        
        return docket;
    }

    protected ApiInfo getApiInfo(){
        Contact contact = new Contact("龙卷风", "https://www.sviping.com", "sunwq@sviping.com");

        return new ApiInfo("Api 文档",
                "我的Api文档",
                "1.0",
                "urn:tos",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }

    @Bean
    public Docket getDocket1() {
        Docket docket = new Docket(DocumentationType.OAS_30);
        docket.apiInfo(getApiInfo());
        docket.groupName("docket1");
        docket.select().apis(RequestHandlerSelectors.basePackage("com.qing.controller.swagger")).build();
        return docket;
    }

    @Bean
    public Docket getDocket2() {
        Docket docket = new Docket(DocumentationType.OAS_30);
        docket.apiInfo(getApiInfo());
        docket.groupName("docket2");
        docket.select().apis(RequestHandlerSelectors.basePackage("com.qing.controller.swagger")).build();
        return docket;
    }

    @Bean
    public Docket getDocket3() {
        Docket docket = new Docket(DocumentationType.OAS_30);
        docket.apiInfo(getApiInfo());
        docket.groupName("docket3");
        docket.select().apis(RequestHandlerSelectors.basePackage("com.qing.controller.swagger")).build();
        return docket;
    }
}

3. 控制器代码

package com.qing.controller.swagger;

import io.swagger.annotations.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/swagger")
@Tag(name = "接口文档title", description = "接口文档description")
public class SwaggerController {

    @GetMapping(value = "/user")
    @Operation(summary ="接口方法描述")
    @ApiResponses({
            @ApiResponse(code = 403, message = "无权限"),
            @ApiResponse(code = 404, message = "接口未找到")
    })
    public User user(@Parameter(name = "name", description = "用户名") String name, @Parameter(name = "age", description = "年龄") Integer age) {
        User user = new User();
        user.setName(name);
        user.setAge(age);
        System.out.println(user);
        return user;
    }
}

@ApiModel("user类")
class User{

    @Schema(name = "姓名", title = "name 的title")
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

4. 常用注解说明

注解位置说明
@EnableOpenApiswagger配置类
@Tag
Controller类的说明信息
@OperationController方法类的方法说明
@ParameterController方法参数方法参数说明
@ApiResponsesController方法一组响应
@ApiResponse@ApiResponses一条错误响应信息
@ApiModel响应类返回的响应信息

本文章为本站原创,如转载请注明文章出处:https://www.sviping.com/archives/45

分享到:
上一篇: CentOS 7.8 源码编译安装 PHP8 下一篇: springboot配置国际化支持多语言
12