12 05月 2021

官网:https://swagger.io/
swagger是一个文档在线自动生成器,它可以在线测试ApI,支持多种语言。之所以会产生这个框架,是因为在实际的项目开发过程中,前后端是分离的,他们之间通过API进行交互,但是由于两者之间无法做到实时的同步,可能会导致问题的发生。而swagger解决了上述问题,可以使得API实时在线更新,还可以在线测试。

1.集成Swagger

swagger3.0只需要引入这一个依赖

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

如果是swagger2.x,需要导入下面的坐标

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger2</artifactId>
   <version>2.9.2</version>
</dependency>
<!-- 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>

2.配置Swagger

由于很简单下面直接上代码

@Configuration //声明该类是一个配置类
@EnableSwagger2 //开启swagger
public class SwaggerConfig {
    /**
     * 创建Docket的bean实例对象
     * @return
     */
    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("user") // 配置分组
                .enable(true) //配置是否启用Swagger,如果是false,在浏览器将无法访问
                .select()// 通过.select()方法,去配置扫描接口,RequestHandlerSelectors配置如何扫描接口
                //.any() // 扫描所有,项目中的所有接口都会被扫描到
                //.none() // 不扫描接口
                // 通过方法上的注解扫描,如withMethodAnnotation(GetMapping.class)只扫描get请求
                //.withMethodAnnotation(final Class<? extends Annotation> annotation)扫描方法上的指定注解
                // 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口
                //.withClassAnnotation(final Class<? extends Annotation> annotation)
                //.basePackage(final String basePackage) // 根据包路径扫描接口
                .apis(RequestHandlerSelectors.basePackage("com.swagger.controller"))
                // 配置要拦截的路径,any:拦截所有,ant:拦截指定路径,none,都不拦截
                //.paths(PathSelectors.any())
                .build();
    }
    public ApiInfo getApiInfo(){
        //作者信息
        Contact DEFAULT_CONTACT = new Contact("hello", "https://www.xxx.com/", "625291936@qq.com");
        return  new ApiInfo(
                "项目文档", //标题
                "项目文档接口", //描述
                "1.0", //版本
                "https://www.xxx.com/", //项目地址
                DEFAULT_CONTACT, //作者信息
                "Apache 2.0", //许可
                "http://www.apache.org/licenses/LICENSE-2.0", //许可证网址
                new ArrayList<>());
    }
}

3.Swagger分组

只需要在上述controller中加入对应的Docket实例,并将其注入到spring中,在方法中修改groupName即可

//配置多个分组
@Bean
public Docket docket1(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("user1");
}
@Bean
public Docket docket2(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("user2");
}
@Bean
public Docket docket3(){
   return new Docket(DocumentationType.SWAGGER_2).groupName("user3");
}  

4.输入网址测试

在网址栏中输入
swagger3 http://localhost:8080/swagger-ui/index.html
swagger2 http://localhost:8080/swagger-ui.html

图片

注意:如果系统中有拦截器需要把webjars下以及swagger-ui.html等静态资源放行

registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");

5.为Model添加swagger

如果我们想要为某个pojo类添加swagger信息,只需要书写对应的类,然后在controller接口中返回该对象就可以。
注意:User类中一定要有属性的setter,getter方法,否则,在后面的ui界面中不会显示User的属性,而且后面测试带参数的方法时,可能不能接收我们输入的值.

@ApiModel("User实体类")
public class User {
    @ApiModelProperty("用户名")
    private String username;
    @ApiModelProperty("密码")
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

测试

@ApiOperation("获取用户的controller")
    @GetMapping("/user")
    public User User() {
        return new User();
    }

图片

6.Swagger的常用注解

在上述代码中或多或少都已经接触了swagger的常用注解,其实这些注解都是一些注释,他们的存在只是为了方便阅读与调试,如果嫌麻烦,甚至可以完全不用,但是在实际的项目中我们常常会使用他们,因此,掌握他们是非常有必要的,下面进行详解。

@Api: 修饰整个类,用于controller类上
@ApiOperation: 描述一个接口,作用于controller方法上
@ApiParam: 单个参数描述
@ApiModel: 用来对象接收参数,即返回对象
@ApiModelProperty: 对象接收参数时,描述对象的字段,用于entity类中的字段
@ApiResponse: Http响应其中的描述,在ApiResonse中
@ApiResponses: Http响应所有的描述,用在
@ApiIgnore: 忽略这个API
@ApiError: 发生错误的返回信息
@ApiImplicitParam: 一个请求参数
@ApiImplicitParams: 多个请求参数

延伸阅读
  1. 上一篇:Linux安装Redis
  2. 下一篇:SpringBoot整合Druid连接池
发表评论