SpringBoot整合Swagger2

Lou.Chen
大约 4 分钟

SpringBoot整合Swagger2

一、swagger简介

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。 作用:

  1. 接口的文档在线自动生成。
  2. 功能测试。

二、基本配置

1、pom.xml

springfox-swagger2

springfox-swagger-ui

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.lc</groupId>
    <artifactId>swagger2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>swagger2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2、swagger配置文件
@Configuration
@EnableSwagger2
//是否开启swagger,正式环境一般是需要关闭的(避免不必要的漏洞暴露!),可根据springboot的多环境配置进行设置
//这里properties中的配置的swagger.enable和havingValue相等这个配置文件才会生效
@ConditionalOnProperty(name = "swagger.enable",  havingValue = "true")
public class Swagger2Config {

    /**
     *构建swagger摘要
     * @return
     */
    @Bean
    Docket docket() {
//               选择文本类型为SWAGGER_2
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
//               指定controller所在的包
                .apis(RequestHandlerSelectors.basePackage("org.lc.swagger2.controller"))
//                指定包下的所有路径生成文档
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
//                        文档描述信息
                        .description("这是接口文档描述信息")
//                        标题
                        .title("这是项目标题")
//                        联系信息
                        .contact(new Contact("lc", "www.louchen.top", "421192425@qq.com"))
//                        版本
                        .version("v0.0.1")
//                        许可证
                        .license("apache2.0")
                        .build());
    }

}
3、是否开启swagger配置
swagger.enable=true
4、实体描述
@Getter
@Setter
@ToString
@ApiModel(value = "用户实体类",description = "用户信息描述")
public class User {
    @ApiModelProperty(value = "用户id")
    private Integer id;
    @ApiModelProperty(value = "用户名")
    private String name;
    @ApiModelProperty(value = "用户地址")
    private String address;
}

![](images\批注 2020-04-07 211747.png)

5、接口描述
@RestController
//接口上的描述
@Api(tags = "用户数据接口")
public class UserController {

    /**
     * 这里需要指定的请求方式 否则swagger会启用所有方法类型调用
     * @param id
     * @return
     */
//    接口方法上的描述
    @ApiOperation(value = "查询用户",notes = "根据用户id查询用户")
//    接口参数上的描述
//    这里的name为参数名,value为对该参数的解释,required只是对swagger的约束表示必填,默认值为11
    @ApiImplicitParam(name = "id",value = "用户id",required = true,defaultValue = "11")
    @GetMapping("/user")
    public User getUserById(Integer id) {
        User user=new User();
        user.setId(id);
        return user;
    }

    
    @ApiOperation(value = "删除用户",notes = "根据用户id删除用户")
    @ApiImplicitParam(name = "id",value = "用户id",required = true,defaultValue = "22")
//    设置响应的状态码的描述信息
    @ApiResponses({
            @ApiResponse(code = 200, message = "删除成功"),
            @ApiResponse(code = 500, message = "删除失败")
    })
    @DeleteMapping("/user/{id}")
    public void deleteById(@PathVariable("id")Integer id){
        System.out.println("deleteById:"+id);
    }

    
    @ApiOperation(value = "更新用户",notes = "根据用户id更新用户")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "username",value = "用户名",required = true,defaultValue = "lc"),
            @ApiImplicitParam(name = "id",value = "用户id",required = true,defaultValue = "1")
    })
    
    
//    表示忽略此接口生成在swagger中
//    @ApiIgnore
    @PutMapping("/user")
    public User updateUserById(String username,Integer id){
        User user=new User();
        user.setId(id);
        user.setName(username);
        return user;
    }

    @ApiOperation(value = "添加用户",notes = "添加用户信息")
    @PostMapping("/user")
    public User addUser(@RequestBody User user){
        return user;
    }
}

![](images\批注 2020-04-07 211922.png)

![](images\批注 2020-04-07 211949.png)

![](images\批注 2020-04-07 212014.png)

6、swagger注解介绍
  • @Api:可设置对控制器的描述-

  • @ApiOperation:: 可设置对接口方法的描述

  • @ApiIgnore: Swagger 文档不会显示拥有该注解的接口。

  • @ApiImplicitParams: 用于描述接口的非对象参数集。

  • @ApiImplicitParam: 用于描述接口的非对象参数,一般与 @ApiImplicitParams 组合使用。

    • @ApiImplicitParam 注解用来描述一个参数,可以配置参数的中文含义,也可以给参数设置默认值,这样在接口测试的时候可以避免手动输入。

    • 如果有多个参数,则需要使用多个 @ApiImplicitParam 注解来描述,多个 @ApiImplicitParam 注解需要放在一个 @ApiImplicitParams 注解中。

    • 需要注意的是,@ApiImplicitParam 注解中虽然可以指定参数是必填的,但是却不能代替 @RequestParam(required = true) ,前者的必填只是在 Swagger2 框架内必填,抛弃了 Swagger2 ,这个限制就没用了,所以假如开发者需要指定一个参数必填, @RequestParam(required = true) 注解还是不能省略。

  • @ApiModel:可设置接口相关实体的描述

  • @ApiModelProperty: 可设置实体属性的相关描述。

7、在 Security 中的配置

​ 如果我们的 Spring Boot 项目中集成了 Spring Security,那么如果不做额外配置,Swagger2 文档可能会被拦截,此时只需要在 Spring Security 的配置类中重写 configure 方法,添加如下过滤即可:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring()
            .antMatchers("/swagger-ui.html")
            .antMatchers("/v2/**")
            .antMatchers("/swagger-resources/**");
}

如此之后,Swagger2 文件就不需要认证就能访问了