Spring Boot整合Swagger2的完整步骤详解

时间:2022-11-17 17:04:00

前言

swagger,中文“拽”的意思。它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,
而且还提供了在线文档的测试。另外swagger很容易构建restful风格的api。

一、swagger概述

 

swagger是一组围绕openapi规范构建的开源工具,可帮助设计、构建、记录和使用rest api。

简单说下,它的出现就是为了方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口

修改了后,swagger可以实现自动的更新,而不需要认为的维护这个接口进行测试。

二、swagger常用注解

 

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

  • @api:修饰整个类,描述controller的作用
  • @apioperation:描述一个类的一个方法,或者说一个接口
  • @apiparam:单个参数描述
  • @apimodel:用对象来接收参数
  • @apiproperty:用对象接收参数时,描述对象的一个字段
  • @apiresponse:http响应其中1个描述
  • @apiresponses:http响应整体描述
  • @apiignore:使用该注解忽略这个api
  • @apierror :发生错误返回的信息
  • @apiparamimplicitl:一个请求参数
  • @apiparamsimplicit 多个请求参数

三、springboot整合swagger

 

3.1 添加依赖

?
1
2
3
4
5
6
7
8
9
10
<dependency>
   <groupid>io.springfox</groupid>
   <artifactid>springfox-swagger2</artifactid>
   <version>2.7.0</version>
</dependency>
<dependency>
   <groupid>io.springfox</groupid>
   <artifactid>springfox-swagger-ui</artifactid>
   <version>2.7.0</version>
</dependency>

3.2 添加swaggerconfiguration

通过@configuration注解,表明它是一个配置类,@enableswagger2开启swagger2。

apiinfo()配置一些基本的信息。apis()指定扫描的包会生成文档。

再通过createrestapi函数创建docket的bean之后,apiinfo()用来创建该api的基本信息(这些基本信息会
展现在文档页面中)。select()函数返回一个apiselectorbuilder实例用来控制哪些接口暴露给swagger来
展现,本例采用指定扫描的包路径来定义,swagger会扫描该包下所有controller定义的api,并产生文档内容
(除了被@apiignore指定的请求)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.lance.learn.springbootswagger.configuration;
 
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
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;
import springfox.documentation.swagger2.annotations.enableswagger2;
 
/**
 * @author lance(zyh)
 * @function swagger启动配置类
 * @date 2018-07-09 21:24
 */
@configuration
@enableswagger2
public class swaggerconfiguration {
 
 /**
  * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
  * @return
  */
 @bean
 public docket createrestfulapi(){
  return new docket(documentationtype.swagger_2)
    .pathmapping("/")
    .select()
    .apis(requesthandlerselectors.basepackage("com.lance.learn.springbootswagger.controller")) //暴露接口地址的包路径
    .paths(pathselectors.any())
    .build();
 }
 
 /**
  * 构建 api文档的详细信息函数,注意这里的注解引用的是哪个
  * @return
  */
 private apiinfo apiinfo(){
  return new apiinfobuilder()
    //页面标题
    .title("spring boot 测试使用 swagger2 构建restful api")
    //创建人
    .contact(new contact("lanvetobigdata", "http://www.cnblogs.com/zhangyinhua/", "917484312@qq.com"))
    //版本号
    .version("1.0")
    //描述
    .description("api 描述")
    .build();
 }
}

3.3 controller文档内容

描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。

如下所示,我们通过@apioperation注解来给api增加说明、通过@apiimplicitparams、@apiimplicitparam
注解来给参数增加说明。

1)实例一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.lance.learn.springbootswagger.controller;
 
import com.lance.learn.springbootswagger.bean.book;
import io.swagger.annotations.apiimplicitparam;
import io.swagger.annotations.apiimplicitparams;
import io.swagger.annotations.apioperation;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.apiignore;
 
import java.util.*;
 
/**
 * @author lance(zyh)
 * @function
 * @date 2018-07-09 21:39
 */
@restcontroller
@requestmapping(value = "/bookcurd")
public class bookcontroller {
 map<long, book> books = collections.synchronizedmap(new hashmap<long, book>());
 
 @apioperation(value="获取图书列表", notes="获取图书列表")
 @requestmapping(value={""}, method= requestmethod.get)
 public list<book> getbook() {
  list<book> book = new arraylist<>(books.values());
  return book;
 }
 
 @apioperation(value="创建图书", notes="创建图书")
 @apiimplicitparam(name = "book", value = "图书详细实体", required = true, datatype = "book")
 @requestmapping(value="", method=requestmethod.post)
 public string postbook(@requestbody book book) {
  books.put(book.getid(), book);
  return "success";
 }
 @apioperation(value="获图书细信息", notes="根据url的id来获取详细信息")
 @apiimplicitparam(name = "id", value = "id", required = true, datatype = "long",paramtype = "path")
 @requestmapping(value="/{id}", method=requestmethod.get)
 public book getbook(@pathvariable long id) {
  return books.get(id);
 }
 
 @apioperation(value="更新信息", notes="根据url的id来指定更新图书信息")
 @apiimplicitparams({
   @apiimplicitparam(name = "id", value = "图书id", required = true, datatype = "long",paramtype = "path"),
   @apiimplicitparam(name = "book", value = "图书实体book", required = true, datatype = "book")
 })
 @requestmapping(value="/{id}", method= requestmethod.put)
 public string putuser(@pathvariable long id, @requestbody book book) {
  book book1 = books.get(id);
  book1.setname(book.getname());
  book1.setprice(book.getprice());
  books.put(id, book1);
  return "success";
 }
 @apioperation(value="删除图书", notes="根据url的id来指定删除图书")
 @apiimplicitparam(name = "id", value = "图书id", required = true, datatype = "long",paramtype = "path")
 @requestmapping(value="/{id}", method=requestmethod.delete)
 public string deleteuser(@pathvariable long id) {
  books.remove(id);
  return "success";
 }
 
 @apiignore//使用该注解忽略这个api
 @requestmapping(value = "/hi", method = requestmethod.get)
 public string jsontest() {
  return " hi you!";
 }
}

2)实例二

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.lance.learn.springbootswagger.controller;
 
import com.lance.learn.springbootswagger.bean.user;
import io.swagger.annotations.apiimplicitparam;
import io.swagger.annotations.apiimplicitparams;
import io.swagger.annotations.apioperation;
import org.springframework.web.bind.annotation.*;
 
import java.util.*;
 
/**
 * @author lance(zyh)
 * @function
 * @date 2018-07-09 22:00
 */
 
@restcontroller
@requestmapping(value="/users")
public class userdetailcontroller {
  static map<long, user> users = collections.synchronizedmap(new hashmap<long, user>());
 
  @apioperation(value="获取用户列表", notes="")
  @requestmapping(value={""}, method= requestmethod.get)
  public list<user> getuserlist() {
    list<user> r = new arraylist<user>(users.values());
    return r;
  }
 
  @apioperation(value="创建用户", notes="根据user对象创建用户")
  @apiimplicitparam(name = "user", value = "用户详细实体user", required = true, datatype = "user")
  @requestmapping(value="", method=requestmethod.post)
  public string postuser(@requestbody user user) {
    users.put(user.getid(), user);
    return "success";
  }
 
  @apioperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
  @apiimplicitparam(name = "id", value = "用户id", required = true, datatype = "long")
  @requestmapping(value="/{id}", method=requestmethod.get)
  public user getuser(@pathvariable long id) {
    return users.get(id);
  }
 
  @apioperation(value="更新用户详细信息", notes="根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
  @apiimplicitparams({
      @apiimplicitparam(name = "id", value = "用户id", required = true, datatype = "long"),
      @apiimplicitparam(name = "user", value = "用户详细实体user", required = true, datatype = "user")
  })
  @requestmapping(value="/{id}", method=requestmethod.put)
  public string putuser(@pathvariable long id, @requestbody user user) {
    user u = new user();
    users.put(id, u);
    return "success";
  }
 
  @apioperation(value="删除用户", notes="根据url的id来指定删除对象")
  @apiimplicitparam(name = "id", value = "用户id", required = true, datatype = "long")
  @requestmapping(value="/{id}", method=requestmethod.delete)
  public string deleteuser(@pathvariable long id) {
    users.remove(id);
    return "success";
  }
}

3.4 web界面查看

Spring Boot整合Swagger2的完整步骤详解

四、项目代码地址

 

https://github.com/lancetobigdata/springbootlearning/tree/develop/springboot-swagger

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。

原文链接:https://www.cnblogs.com/zhangyinhua/p/9286391.html