Swargger的使用

Swagger介绍

为了解决前后端的及时协调,及时更改项目需求Api调用
而产生的一个工具

使用步骤

创建项目
导入依赖

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

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

创建一个HellWorld工程

import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorld {

    @ResponseBody
    @RequestMapping(value = "/hello")
    public String doHello(){
        return "helloWorld";
    }
}

配置Swagger

因为Swagger不是spring的jar需要配置

import org.springframework.context.annotation.Configuration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
}
  • @Configuration
    等价于 @Component 在ioc容器中添加bean

  • @EnableSwagger2 开启Swagger2功能

启动项目访问:http://localhost:xxxx/swagger-ui.html

  • Api Documentation:Swagger信息

  • basic-error-controller 和 Basic Error Controller 是接口信息

  • Models 是实体类 信息

使用Swagger

  • 更换默认配置
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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

@Configuration
@EnableSwagger2
public class SwaggerConfig {


    Contact contact=new Contact("姓名","http://jilijili.fun","邮箱");


    @Bean
    public Docket Docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo());

    }

    private ApiInfo apiInfo(){
       return  new ApiInfo(
               "Api 标题",
               "Api 描述",
               "1.0 版本",
               "urn:tos 组织",
               contact,
               "Apache 2.0 开源版本号",
               "http://www.apache.org/licenses/LICENSE-2.0",
               new ArrayList());


    }

Contact 类是封装了个人信息,方便联系

Docket 对象封装 整个项目api的详情

  • 使用Swagger
@Configuration
@EnableSwagger2
public class SwaggerConfig {


    Contact contact=new Contact("姓名","http://jilijili.fun","邮箱");


    @Bean
    public Docket Docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.luojiaju.swargger.controller"))
                .build()
                ;

    }

    private ApiInfo apiInfo(){
       return  new ApiInfo(
               "Api 标题",
               "Api 描述",
               "1.0 版本",
               "urn:tos 组织",
               contact,
               "Apache 2.0 开源版本号",
               "http://www.apache.org/licenses/LICENSE-2.0",
               new ArrayList());


    }

  • apis()

    RequestHandlerSelectors.配置扫描接口的方法

    .basePackage() 指定扫描某一个包内的接口

    .any() 扫描全部

    .none() 全都不扫描

    .withClassAnnotation() 扫描类上的注解 ,注解的条件是 该类必须是接口

    .withMethodAnnotation() 扫描方法上的注解

    但是 常用的是 RequestHandlerSelectors.basePackage(package)

  • .paths()

    过滤什么路径

    PathSelectors .

    .ant(final String antPattern) 过滤掉 /controller/xxx.java

    .any() 过滤掉全部

    .none() 全都不过来

    .regex(final String pathRegex) 使用正则表达是过滤

需求:
如果 是 开发环境下使用Swagger,而发布环境下禁止使用Swagger 怎么做到?

  • 获取当前的开发环境,判断是否处于对应的环境下

      @Bean
       public Docket Docket( Environment environment){
   
   
           Profiles of = Profiles.of("test", "dev");
   
           boolean flag = environment.acceptsProfiles(of);
   
           return new Docket(DocumentationType.SWAGGER_2)
                   .apiInfo(apiInfo())
                   .enable(flag)
                   .select()
                   .apis(RequestHandlerSelectors.basePackage("com.luojiaju.swargger.controller"))
                   .build()
                   ;
   
       }

Environment 获取当前的生产环境类

Profiles.of("test", "dev") 项目中的配置环境配置

boolean flag = environment.acceptsProfiles(of); 获取当前的生产环境匹配返回布尔值

.enable(flag) 方法作用是 是否使用Swagger功能, 默认是true 使用

(有个小坑,boolean 数据类型,默认是false ,以及 项目的端口号要注意);

Swagger 的分组

每一开发人员都有自己编写的api 这时就需要更好的管控了

  @Bean
    public Docket Docket3() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("开发人C")
                ;

    }
    @Bean
    public Docket Docket2() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("开发人B")
                ;

    }

启动项目

Select a spec 会有下拉选择

生成Model

Swagger中还提供了,实体类的基本信息和注解信息

  • 在接口中返回实体类信息

        @PostMapping(value = "/user")
        public UserModel doUserQuery(){
            return new UserModel();
        }
    

    运行程序就可以看到 Swagger对Model的使用了

    注意的是,private 的属性 需要加上set get方法

  • 在接口和Model中添加注释

	@ApiModel("这是实体类")	public class UserModel {    	@ApiModelProperty("这是实体类的属性注释")    	private String username;    	@ApiModelProperty("这是实体类的属性注释")    	private String password;    }    @ApiOperation("这是接口的方法描述:获取用户名称")    @PostMapping(value = "/user2")    public UserModel doUserQuery2(@ApiParam("用户名称") String name){        return new UserModel();    }

做好注解之后Swagger会生成相关信息;

最后

Swagger最厉害的是接口可以在线测试 ,这个最简单自行测试吧!

如果有错误会有错误信息,这样前后端人员对接协调及时,提高合作关系!!

上一篇:linux常用命令的整理


下一篇:VMware Tools 继续运行脚本未能在虚拟机中成功运行 解决方式