网站首页> 博客> SpringBoot整合Swagger2

SpringBoot整合Swagger2

好文
290

相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人开发前后台的年代,当我没说,如今为了前后台更好的对接,还是为了以后交接方便,都有要求写API文档。

 

手写Api文档的几个痛点:

  1. 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。

  2. 接口返回结果不明确

  3. 不能直接在线测试接口,通常需要使用工具,比如postman

  4. 接口文档太多,不好管理

Swagger也就是为了解决这个问题,当然也不能说Swagger就一定是完美的,当然也有缺点,最明显的就是代码移入性比较强。

其他的不多说,想要了解Swagger的,可以去Swagger官网,可以直接使用Swagger editor编写接口文档,当然我们这里讲解的是SpringBoot整合Swagger2,直接生成接口文档的方式。

一、依赖


	io.springfox
	springfox-swagger2
	2.6.1
	io.springfox
	springfox-swagger-ui
	2.6.1

二、Swagger配置类

其实这个配置类,只要了解具体能配置哪些东西就好了,毕竟这个东西配置一次之后就不用再动了。 特别要注意的是里面配置了api文件也就是controller包的路径,不然生成的文档扫描不到接口。

package cn.saytime;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.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;/**
 * @author zh
 * @ClassName cn.saytime.Swgger2
 * @Description
 * @date 2017-07-10 22:12:31
 */@Configurationpublic class Swagger2 {	@Bean
	public Docket createRestApi() {		return new Docket(DocumentationType.SWAGGER_2)
				.apiInfo(apiInfo())
				.select()
				.apis(RequestHandlerSelectors.basePackage("cn.saytime.web"))
				.paths(PathSelectors.any())
				.build();
	}	
	private ApiInfo apiInfo() {		return new ApiInfoBuilder()
				.title("springboot利用swagger构建api文档")
				.description("简单优雅的restfun风格,http://blog.csdn.net/saytime")
				.termsOfServiceUrl("http://blog.csdn.net/saytime")
				.version("1.0")
				.build();
	}
}

用@Configuration注解该类,等价于XML中配置beans;用@Bean标注方法等价于XML中配置bean。

Application.class 加上注解@EnableSwagger2 表示开启Swagger

package cn.saytime;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import springfox.documentation.swagger2.annotations.EnableSwagger2;@SpringBootApplication@EnableSwagger2public class SpringbootSwagger2Application {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootSwagger2Application.class, args);
	}
}

三、Restful 接口

package cn.saytime.web;import cn.saytime.bean.JsonResult;import cn.saytime.bean.User;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiImplicitParams;import io.swagger.annotations.ApiOperation;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import springfox.documentation.annotations.ApiIgnore;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map;/**
 * @author zh
 * @ClassName cn.saytime.web.UserController
 * @Description
 */@RestControllerpublic class UserController {	// 创建线程安全的Map
	static Map users = Collections.synchronizedMap(new HashMap());	/**
	 * 根据ID查询用户
	 * @param id
	 * @return
	 */
	@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息")	@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer", paramType = "path")	@RequestMapping(value = "user/{id}", method = RequestMethod.GET)	public ResponseEntity getUserById (@PathVariable(value = "id") Integer id){
		JsonResult r = new JsonResult();		try {
			User user = users.get(id);
			r.setResult(user);
			r.setStatus("ok");
		} catch (Exception e) {
			r.setResult(e.getClass().getName() + ":" + e.getMessage());
			r.setStatus("error");
			e.printStackTrace();
		}		return ResponseEntity.ok(r);
	}	/**
	 * 查询用户列表
	 * @return
	 */
	@ApiOperation(value="获取用户列表", notes="获取用户列表")	@RequestMapping(value = "users", method = RequestMethod.GET)	public ResponseEntity getUserList (){
		JsonResult r = new JsonResult();		try {
			List userList = new ArrayList(users.values());
			r.setResult(userList);
			r.setStatus("ok");
		} catch (Exception e) {
			r.setResult(e.getClass().getName() + ":" + e.getMessage());
			r.setStatus("error");
			e.printStackTrace();
		}		return ResponseEntity.ok(r);
	}	/**
	 * 添加用户
	 * @param user
	 * @return
	 */
	@ApiOperation(value="创建用户", notes="根据User对象创建用户")	@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")	@RequestMapping(value = "user", method = RequestMethod.POST)	public ResponseEntity add (@RequestBody User user){
		JsonResult r = new JsonResult();		try {
			users.put(user.getId(), user);
			r.setResult(user.getId());
			r.setStatus("ok");
		} catch (Exception e) {
			r.setResult(e.getClass().getName() + ":" + e.getMessage());
			r.setStatus("error");

			e.printStackTrace();
		}		return ResponseEntity.ok(r);
	}	/**
	 * 根据id删除用户
	 * @param id
	 * @return
	 */
	@ApiOperation(value="删除用户", notes="根据url的id来指定删除用户")	@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long", paramType = "path")	@RequestMapping(value = "user/{id}", method = RequestMethod.DELETE)	public ResponseEntity delete (@PathVariable(value = "id") Integer id){
		JsonResult r = new JsonResult();		try {
			users.remove(id);
			r.setResult(id);
			r.setStatus("ok");
		} catch (Exception e) {
			r.setResult(e.getClass().getName() + ":" + e.getMessage());
			r.setStatus("error");

			e.printStackTrace();
		}		return ResponseEntity.ok(r);
	}	/**
	 * 根据id修改用户信息
	 * @param user
	 * @return
	 */
	@ApiOperation(value="更新信息", notes="根据url的id来指定更新用户信息")	@ApiImplicitParams({			@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long",paramType = "path"),			@ApiImplicitParam(name = "user", value = "用户实体user", required = true, dataType = "User")
	})	@RequestMapping(value = "user/{id}", method = RequestMethod.PUT)	public ResponseEntity update (@PathVariable("id") Integer id, @RequestBody User user){
		JsonResult r = new JsonResult();		try {
			User u = users.get(id);
			u.setUsername(user.getUsername());
			u.setAge(user.getAge());
			users.put(id, u);
			r.setResult(u);
			r.setStatus("ok");
		} catch (Exception e) {
			r.setResult(e.getClass().getName() + ":" + e.getMessage());
			r.setStatus("error");

			e.printStackTrace();
		}		return ResponseEntity.ok(r);
	}	@ApiIgnore//使用该注解忽略这个API
	@RequestMapping(value = "/hi", method = RequestMethod.GET)	public String  jsonTest() {		return " hi you!";
	}
}

Json格式输出类 JsonResult.class

package cn.saytime.bean;public class JsonResult {

	private String status = null;	private Object result = null;	// Getter Setter}

实体User.class

package cn.saytime.bean;import java.util.Date;/**
 * @author zh
 * @ClassName cn.saytime.bean.User
 * @Description
 */public class User {

	private int id;	private String username;	private int age;	private Date ctm;	// Getter Setter}

项目结构:

这里写图片描述

四、Swagger2文档

启动SpringBoot项目,访问 http://localhost:8080/swagger-ui.html

这里写图片描述

具体里面的内容以及接口测试,应该一看就懂了。这里就不一一截图了。

五、Swagger注解

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

  • @Api:修饰整个类,描述Controller的作用

  • @ApiOperation:描述一个类的一个方法,或者说一个接口

  • @ApiParam:单个参数描述

  • @ApiModel:用对象来接收参数

  • @ApiProperty:用对象接收参数时,描述对象的一个字段

  • @ApiResponse:HTTP响应其中1个描述

  • @ApiResponses:HTTP响应整体描述

  • @ApiIgnore:使用该注解忽略这个API

  • @ApiError :发生错误返回的信息

  • @ApiImplicitParam:一个请求参数

  • @ApiImplicitParams:多个请求参数


转载链接:https://www.cnblogs.com/jtlgb/p/8532433.html


  • 没有任何评论
个评论
格式化记忆

格式化记忆 (青铜)

44012金币 (169)粉丝 (26)源码

(该家伙很懒,什么也没说!)

 

签到 活跃榜 连续签到送额外金币
最新博客
fastjson的使用总结 42
获取金币 101
idea激活破解时碰见的各种问题集锦 527
关于使用java语言读取文件时候头部出现\uFEFF问题的解决 307
Spring 的起源 167
Spring 的起源 302
牛郎决定去学编程 312
SpringBoot整合Swagger2 289