SpringBoot整合Swagger2

Swagger2

Swagger2用于解决前后端开发人员之间的api对接,减少与其他团队开发期间的沟通成本。Swagger2可以轻松的整合到Spring boot中,并与SpringMVC程序配合组织处强大的Restful API文档。即可以减少我们创建文档的工作量,同时说明内容整合到实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。
另外,Swagger2也提供了强大的页面测试功能来调试每个Restful API

添加Swagger2依赖

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.2.2</version>
</dependency>

创建Swagger2配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket CreateRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.hoo.springboot"))
.paths(PathSelectors.any())
.build();
}

private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.build();
}
}

如以上代码,通过@Configuration注解,让Spring来加载该类配置。再通过@EnabledSwagger2注解来启用Swagger2。

再通过createRestApi函数创建Docket的Bean之后,apiInfo()用来创建该Api的基本信息(这些基本信息会展现在文档页面中)。select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现,本例采用指定扫描的包路径来定义,Swagger会扫描该包下所有Controller定义的API,并产生文档内容(除了被@ApiIgnore指定的请求)。

添加文档内容

在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过@ApiOperation注解来给API增加说明、通过@ApiImplicitParams@ApiImplicitParam注解来给参数增加说明。

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
@RestController
@RequestMapping(value = "/users")
public class UserController {

/**
* 创建一个线程安全的Map模拟数据用户信息
*/
static Map<Integer, User> userMap = Collections.synchronizedMap(new HashMap<Integer,User>());

@ApiOperation(value="获取用户列表", notes="")
@RequestMapping(value = "/",method = RequestMethod.GET)
public List<User> getUserList(){
List<User> r = new ArrayList<User>(userMap.values());
return r;
}

@ApiOperation(value="创建用户", notes="根据User对象创建用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
@RequestMapping(value = "/",method = RequestMethod.POST)
public String postUser(@ModelAttribute User user){
userMap.put(user.getId(),user);
return "success";
}

@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer")
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public User getUser(@PathVariable Integer id){

return userMap.get(id);
}

@ApiOperation(value="更新用户详细信息", notes="根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer"),
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
})
@RequestMapping(value = "/{id}",method = RequestMethod.PUT)
public String putUser(@PathVariable Integer id,@ModelAttribute User user){
System.out.println(id);
System.out.println(user.toString());
User u = userMap.get(id);
u.setAge(user.getAge());
u.setName(user.getName());

userMap.put(id,u);
return "success";
}

@ApiOperation(value="删除用户", notes="根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer")
@RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
public String deleteUser(@PathVariable Integer id){

userMap.remove(id);
return "success";
}
}

完成上述代码添加上,启动Spring Boot程序,访问:http://localhost:8080/swagger-ui.html
eCParT.md.jpg