• SpringBoot-Swagger


    Swagger

    1. 简介

    • 号称世界上最流行的API框架
    • RestFul API 文档在线自动生成工具 => API文档与API定义同步更新
    • 直接运行, 可以在线测试API接口
    • 支持多种语言
    • 在项目中使用Swagger需要SpringFox
      • Swagger2
      • ui

    2. SpringBoot集成Swagger

    1. 导入依赖

    Swagger3.0直接导入Springfox Boot Starter就可以了

    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
    

    2.X版本需要导入Swagger2.0和UI

    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    

    我们这里还是使用2.X版本

    2. 配置Swagger

    package com.wang.config;
    
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    @Configuration
    //开启Swagger2
    @EnableSwagger2
    public class SwaggerConfig {
        
    }
    

    注意

    • 只要在Swagger配置类上加上@EnableSwagger2注解, 就可以使用Swagger2了
    • Swagger的地址为http://localhost:8080/swagger-ui.html

    3. Swagger配置

    1. 配置Swagger信息

    Swagger的Bean实例 ==> Docket

    package com.wang.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.service.VendorExtension;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
    
    import java.util.ArrayList;
    
    @Configuration
    //开启Swagger2
    @EnableSwagger2
    public class SwaggerConfig {
    
        //配置了Swagger的Docket的Bean实例
        @Bean
        public Docket docket() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .apiInfo(apiInfo());
        }
    
        //配置Swagger信息 apiInfo
        private ApiInfo apiInfo() {
            //作者信息
            Contact contact = new Contact("wang", "https://www.cnblogs.com/wang-sky/", "715180879@qq.com");
    
            return new ApiInfo(
                    "我的Swagger接口文档",
                    "这是一个Swagger接口文档",
                    "V 1.0",
                    "https://www.cnblogs.com/wang-sky/",
                    contact,
                    "Apache 2.0",
                    "http://www.apache.org/licenses/LICENSE-2.0",
                    new ArrayList<VendorExtension>());
        }
    
    
    }
    

    这里修改的是Swagger页面的一些信息, 结果如下

    image-20200925141343307

    注意

    • Docket不要忘了注册Bean并返回一个new Docket
    • 返回的Docket要传入一个参数指定产生的文档的类型, 我们这里使用 DocumentationType.SWAGGER_2

    2. Swagger配置扫描接口

    Docket.select()

    @Bean
    public Docket docket() {
        //RequestHandlerSelectors 配置要扫描接口的方式
        /*
        basePackage     指定要扫描的包
        any             扫描全部
        none            都不扫描
        withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象, 比如 withClassAnnotation(RestController.class)
        withMethodAnnotation    扫描方法上的注解
         */
        //paths 过滤的路径, 需要传入PathSelectors.xxx 选择过滤的方式
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.wang.controller"))
                .paths(PathSelectors.ant("/wang/**"))
                .build();
    }
    

    注意

    • apis 扫描, 要传入RequestHandlerSelectors.xxx 指定扫描的方式
      • basePackage 指定要扫描的包
      • any 扫描全部
      • none 都不扫描
      • withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象, 比如 withClassAnnotation(RestController.class)
      • withMethodAnnotation 扫描方法上的注解
    • paths 过滤的路径, 需要传入PathSelectors.xxx 选择过滤的方式
    • 最后要.build(), 建造者模式, 同时由于这是链式编程, 一定要写!
    • select().XXX.XXX...bulid()是一套, 中间可以写的方法是确定的, 不能乱写

    3. 配置Swagger是否启动

    只在生产环境下使用Swagger, 而在发布的时候不使用的方法

    分别建立不同环境的yml

    image-20200925150147345

    在application中选择启动的环境, 这里选择生产环境

    spring:
      profiles:
        active: dev
    

    配置Swagger

    //配置了Swagger的Docket的Bean实例
    @Bean
    public Docket docket(Environment environment) {
        //RequestHandlerSelectors 配置要扫描接口的方式
        /*
        basePackage     指定要扫描的包
        any             扫描全部
        none            都不扫描
        withClassAnnotation 扫描类上的注解,参数是一个注解的反射对象, 比如 withClassAnnotation(RestController.class)
        withMethodAnnotation    扫描方法上的注解
         */
        //paths 过滤的路径, 需要传入PathSelectors.xxx 选择过滤的方式
    
        //设置要显示的Swagger环境
        Profiles profiles = Profiles.of("dev");
    
        //通过environment.acceptsProfiles, 判断是否处在自己设定的环境当中
        boolean flag = environment.acceptsProfiles(profiles);
    
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.wang.controller"))
                .paths(PathSelectors.ant("/wang/**"))
                .build()
                .enable(flag);
    }
    

    注意

    • .enable
    • 只能在select().XXX.XXX....bulid() 外面写
    • 默认为true, 如果为False, 则Swagger不能在浏览器中访问
    • 要用 Profiles profiles = Profiles.of("dev"); 指定激活的环境的名字
    • 获得当前的生产环境(application指定的环境), 要给Docket传入一个Environment对象, 其中保存了当前环境的名字
    • environment.acceptsProfiles(profiles); 利用此方法获得是否在给定环境的布尔值

    4. 配置API文档的分组

    .groupName("我的API")
    

    配置多个分组, 只需要配置多个Docket即可

    4. 实体类配置

    1. 实体类的注解

    package com.wang.pojo;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    
    @Data
    //@Api("注释")
    @ApiModel("用户实体类")
    public class User {
    
        @ApiModelProperty("用户名")
        private String username;
        @ApiModelProperty("密码")
        private String password;
    }
    

    @ApiModel或者@Api在类上

    @ApiModelProperty在属性上

    属性为私有, 要写getter才能取到属性名

    结果显示在Model上

    image-20200925162237381

    2. 接口类的注解

    package com.wang.controller;
    
    import com.wang.pojo.User;
    import io.swagger.annotations.ApiOperation;
    import io.swagger.annotations.ApiParam;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
    
        @GetMapping(value = "/hello")
        public String hello() {
            return "Hello!";
        }
    
        //只要我们的接口中, 返回值中存在实体类, 他就会被扫描到Swagger中
        @PostMapping("/user")
        public User user() {
            return new User();
        }
    
        //Operation接口
        //Get请求中, 如果添加了字段的注释@ApiParam, Swagger无法测试
        @ApiOperation("Hello2接口")
        @GetMapping("/hello2")
        public String hello2(String username) {
            return "hello " + username;
        }
    
        //Operation接口
        @ApiOperation("Hello3接口")
        @PostMapping("/hello3")
        public User hello3(@ApiParam("用户") User user) {
            return user;
        }
    }
    

    注意

    • 只要我们的接口中, 返回值中存在实体类或者字符串, 他就会被扫描到Swagger中
    • @ApiOperation 方法的注释
    • @ApiParm 参数的注释
    • Get请求中, 如果添加了字段的注释@ApiParam, Swagger无法测试

    5. 总结

    • 我们可以通过Swagger给一些比较难理解的属性或者接口, 增加注释信息
    • 接口文档实时更新
    • 可以在线测试
    • 注意, 在正式发布的时候, 关闭Swagger(出于安全考虑, 而且节省运行内存)
  • 相关阅读:
    C#调用WebService实现天气预报
    火狐完整版下载地址
    Unity3D 中 2D_Toolkit插件下载 和 导入方法
    给大家分享个 网站头像上传的 插件
    JQuery工具方法,实例方法
    ireport5.6.0 win10打不开
    JFreeChart 零散
    JS 类继承 原型继承
    技术电子书下载网址
    正则 变量替换
  • 原文地址:https://www.cnblogs.com/wang-sky/p/13731068.html
Copyright © 2020-2023  润新知