springboot(十六)-swagger2
SpringBoot整合Swagger2
相信各位在公司写API文档数量应该不少,当然如果你还处在自己一个人开发前后台的年代,当我没说,如今为了前后台更好的对接,还是为了以后交接方便,都有要求写API文档。
手写Api文档的几个痛点:
- 文档需要更新的时候,需要再次发送一份给前端,也就是文档更新交流不及时。
- 接口返回结果不明确
- 不能直接在线测试接口,通常需要使用工具,比如postman
- 接口文档太多,不好管理
Swagger也就是为了解决这个问题,当然也不能说Swagger就一定是完美的,当然也有缺点,最明显的就是代码移入性比较强。
其他的不多说,想要了解Swagger的,可以去Swagger官网,可以直接使用Swagger editor编写接口文档,当然我们这里讲解的是SpringBoot整合Swagger2,直接生成接口文档的方式。
添加pom依赖
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger2</artifactId>
- <version>2.6.1</version>
- </dependency>
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger-ui</artifactId>
- <version>2.6.1</version>
- </dependency>
Swagger配置类
其实这个配置类,只要了解具体能配置哪些东西就好了,毕竟这个东西配置一次之后就不用再动了。 特别要注意的是里面配置了api文件也就是controller包的路径,不然生成的文档扫描不到接口。
- 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
- */
- @Configuration
- public 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("简单优雅的restfull风格,https://www.cnblogs.com/fengyuduke")
- .termsOfServiceUrl("https://www.cnblogs.com/fengyuduke")
- .version("1.0")
- .build();
- }
- }
用@Configuration注解该类,等价于XML中配置beans;用@Bean标注方法等价于XML中配置bean。
启动类
- @SpringBootApplication
- @EnableSwagger2
- public class SpringbootSwagger2Application {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootSwagger2Application.class, args);
- }
- }
加上注解@EnableSwagger2 表示开启Swagger。
- 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
- */
- @RestController
- public class UserController {
- // 创建线程安全的Map
- static Map<Integer, User> users = Collections.synchronizedMap(new HashMap<Integer, User>());
- /**
- * 根据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<JsonResult> 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<JsonResult> getUserList (){
- JsonResult r = new JsonResult();
- try {
- List<User> userList = new ArrayList<User>(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<JsonResult> 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<JsonResult> 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<JsonResult> 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!";
- }
- }
启动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:多个请求参数
springboot(十六)-swagger2的更多相关文章
- SpringBoot(十六)_springboot整合JasperReport6.6.0
现在项目上要求实现套打,结果公司里有个人建议用JaperReport进行实现,就进入这个东西的坑中.好歹经过挣扎现在已经脱离此坑中.现在我也是仅能实现读取数据库数据转成pdf进行展示,包括中文的展示. ...
- SpringBoot(十六):SpringBoot2.1.1集成fastjson,并使用fastjson替代默认的MappingJackson
springboot2.1.1默认采用的json converter是MappingJackson,通过调试springboot项目中代码可以确定这点.在springboot项目中定义WebMvcCo ...
- springboot(十六):使用Jenkins部署Spring Boot
jenkins是devops神器,本篇文章介绍如何安装和使用jenkins部署Spring Boot项目 jenkins搭建 部署分为三个步骤: 第一步,jenkins安装 第二步,插件安装和配置 第 ...
- springboot(十六):springboot整合shiro
数据库有五张表(userInfo,uerrole,role,rolepermission,permission) userInfo(id,username,password) userrole(uid ...
- SpringBoot | 第二十六章:邮件发送
前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...
- springboot(十四):springboot整合shiro-登录认证和权限管理(转)
springboot(十四):springboot整合shiro-登录认证和权限管理 .embody{ padding:10px 10px 10px; margin:0 -20px; border-b ...
- 跟我学SpringCloud | 第十六篇:微服务利剑之APM平台(二)Pinpoint
目录 SpringCloud系列教程 | 第十六篇:微服务利剑之APM平台(二)Pinpoint 1. Pinpoint概述 2. Pinpoint主要特性 3. Pinpoint优势 4. Pinp ...
- Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置
Actuator 简介 Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能.通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘.内存.C ...
- spring-boot-route(十六)使用logback生产日志文件
日志是一个系统非常重要的一部分,我们经常需要通过查看日志来定位问题,今天我们一起来学习一下Spring Boot的日志系统.有很多同学习惯性的在生产代码中使用System.out来输出日志,这是不推荐 ...
随机推荐
- Asp.Net WebAPI 通过HttpContextBase或者HttpRquest 获取请求参数
WEBAPI中的Request是HttpRequestMessage类型,不能像Web传统那样有querystring和from 方法接收参数,而传统的HttpReqest的基类是HttpReqest ...
- windows10下如何完全卸载串口驱动?
答: 所需步骤如下: 1. 以管理员身份启动cmd 2. 在cmd中输入两行命令来启动设备管理器 3. 设置view->Show hidden devices 4. 在Ports (COM &a ...
- 原来项目更换svn地址
近期公司由于旧地址装修,临时更换办公地址:同时相应的网络地址也更换了.我们开发项目的svn地址根目录也得改变.所以怎么解决呢? 1.找到项目根文件夹: 右键:
- javascript之DOM(Document Object Model) 文档对象模型
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- MVC和MVP区别
从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑. 在MVC模型里,更关注的Model的不变,而同时有 ...
- WPF Slider Tickbar 中显示数值
class CustomTickBar : TickBar { protected override void OnRender(System.Windows.Media.DrawingContext ...
- 2019.12.04 ADT on eclipse 配置篇
今天看JerryWang的简书博客https://www.jianshu.com/p/74ad8e4bbc49 ,SAP GUI 和ADT是互为补充的关系,有很多SAP新出的技术都没有办法在GUI上开 ...
- padding的计算方法
转自https://blog.csdn.net/qq_34599526/article/details/83755275 VALID:如果卷积核超出特征层,就不再就计算,即卷积核右边界不超出Featu ...
- C++ vector的详细用法
vector容器类型 vector容器是一个模板类,可以存放任何类型的对象(但必须是同一类对象).vector对象可以在运行时高效地添加元素,并且vector中元素是连续存储的.vector的构造 函 ...
- 从gopath到go mod的一次尝试
windows下的尝试: gomod初尝试下载官方包1.11(及其以上版本将会自动支持gomod) 默认GO111MODULE=auto(auto是指如果在gopath下不启用mod)go mod h ...