Spring Boot集成Swagger2

警告
本文最后更新于 2023-03-05,文中内容可能已过时,请谨慎使用。
Swagger SpringBoot
版本 2.9.2 2.5.6
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>
package cc.bnblogs.swagger_study.config;

import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import org.springframework.context.annotation.Bean;
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;

@EnableSwagger2
@Configuration
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //为当前包路径,控制器类包
                .apis(RequestHandlerSelectors.basePackage("cc.bnblogs.swagger_study.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //页面标题
                .title("Spring Boot集成Swagger2构建RESTful API")
                //创建人
                .contact(new Contact("barney", "https://hugo.bnblogs.cc",  "xxx@xxx.com"))
                //版本号
                .version("1.0")
                //描述
                .description("演示系统API描述")
                .build();
    }
}

访问路径:http://localhost:8080/swagger-ui.html

any() // 扫描所有,项目中的所有接口都会被扫描到
none() // 不扫描接口
withMethodAnnotation(final Class<? extends Annotation> annotation)// 通过方法上的注解扫描withMethodAnnotation(GetMapping.class) // 只扫描get请求
withClassAnnotation(final Class<? extends Annotation> annotation) // 通过类上的注解扫描withClassAnnotation(RestController.class) // 只扫描有RestController注解的类中的接口
basePackage(final String basePackage) // 根据包路径扫描接口
any() // 任何请求都扫描
none() // 任何请求都不扫描
regex(final String pathRegex) // 通过正则表达式控制,返回true扫描,false不扫描
ant(final String antPattern) // 通过ant()表达式控制,返回true扫描,false不扫描

可以通过ignoredParameterTypes()方法去配置要忽略的参数

@Bean
public Docket docket(Environment environment) {
    // 设置要显示swagger的环境
    Profiles of = Profiles.of("dev", "test");
    // 判断当前是处于dev或test环境,通过 enable() 接收此参数判断是否要显示
    boolean b = environment.acceptsProfiles(of);

    return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
        .ignoredParameterTypes(HttpServletRequest.class)
        .enable(b) // 配置是否启用Swagger,如果是false,在浏览器将无法访问
        .select()
        .apis(RequestHandlerSelectors.basePackage("cc.bnblogs.swagger_study.controller")).build();
}

通过groupName()方法即可配置分组,如按照不同的controller分组

@Bean
public Docket docketDemo() {

    return new Docket(DocumentationType.SWAGGER_2)
        .groupName("demo")
        .apiInfo(apiInfo())
        .select()
        .paths(PathSelectors.ant("/demo/**"))
        .build();
}

@Bean
public Docket docketHello() {

    return new Docket(DocumentationType.SWAGGER_2)
        .groupName("hello")
        .apiInfo(apiInfo())
        .select()
        .paths(PathSelectors.ant("/hello/**"))
        .build();
}

并不是因为@ApiModel这个注解让实体显示在这里了,而是出现在接口方法的返回值或者使用@RequestBody入参的实体都会显示在这里(这是因为Swagger会扫描json格式的实体数据)

@ApiModel@ApiModelProperty这两个注解只是为实体添加注释的。

  • @ApiModel为类添加注释

  • @ApiModelProperty为类属性添加注释

例如定义下面的Student实体

@ApiModel("学生表")
public class Student {
    
    @ApiModelProperty("学号")
    private Integer id;
    
    @ApiModelProperty("姓名")
    private String name;
}

所有接口都需要携带的参数

header: 请求头参数

query url中的请求参数

@Bean
public Docket docket(){
    // 新建一个全局参数
    Parameter token = new ParameterBuilder().name("token")
        // 描述信息
        .description("用户登录令牌")
        // 该参数放在请求头
        .parameterType("header") // 也可以设置query参数,
        // 参数的类型
        .modelRef(new ModelRef("String"))
        // 该参数必填
        .required(true)
        .build();

    List<Parameter> parameters = new ArrayList<>();
    parameters.add(token);

    return new Docket(DocumentationType.SWAGGER_2)
        .globalOperationParameters(parameters).apiInfo(apiInfo());

}

Swagger上的一些接口提供备注信息

/images/all/image-20230305171721442.png
@Api(tags = "demo接口")
@RestController
@RequestMapping("/demo/")
public class DemoController {
    @GetMapping
    @ApiOperation("输出hello world")
    public String greet() {
        return "Hello, World";
    }

    @PostMapping("/{id}/")
    @ApiOperation("提交一个id")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "编号", example = "1"),
        @ApiImplicitParam(name = "name", value = "姓名", example = "admin")
    })
    public Integer addInfo(@RequestParam Integer id,
                           @RequestParam String name) {
        System.out.println(name);
        return id;
    }
}
  • 方案1

    给各个实体类上的每个非String字段提供参考值

    @ApiModelProperty(name = "学号",example = "1")
    private Integer id;
    
  • 方案2

    修改pom.xml文件,不使用原来swagger-models(v1.5.20),改用swagger-models(v1.5.22)

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
        <exclusions>
            <exclusion>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-models</artifactId>
        <version>1.5.22</version>
    </dependency>
    
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    

相关文章