springboot整合Swagger2

1、首先创建一个springboot工程,在pom文件内导入依赖

  <!--swagger依赖-->
      <!--Swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!--Swagger-ui界面-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.0</version>
        </dependency>

2、在springboot工程内的项目运行无误后,创建配置类SwaggerConfig

 @Configuration // 配置类
 @EnableSwagger2 // 开启Swagger2
 public class SwaggerConfig {
 ​
   /**
    * 配置了Swagger的Docket的Bean实例
    * 可以有多个
    * @return
    */
   @Bean
   public Docket docket(Environment environment) {
     // 获取项目环境
     // 设置要显示的Swagger2环境
     Profiles profiles = Profiles.of("dev");
     // 监听   通过environment.acceptsProfiles判断是否处在自己设定的环境
     boolean flag = environment.acceptsProfiles(profiles);
 ​
     return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
         // Select a spec默认值
        .groupName("茶碗儿")
         // 是否开启swagger2
         // .enable(false)
         // 监听
        .enable(flag)
        .select()
         // RequestHandlerSelectors   配置要扫描接口的方式
         // basePackage               指定扫描的包
         // any                       扫描全部
         // none                     不扫描
         // withClassAnnotation       扫描类上的注解,参数是一个注解的反射对象
         // withMethodAnnotation     扫描方法上的注解
        .apis(RequestHandlerSelectors.basePackage("com.changgou.controller"))
         // 过滤路径
         // .paths(PathSelectors.ant("/changgou/**"))
        .build();
  }
 ​
   @Bean
   public Docket docket1(Environment environment) {
     return new Docket(DocumentationType.SWAGGER_2)
            .groupName("花生糖");
  }
 ​
   // 配置Swagger2信息
   private ApiInfo apiInfo() {
     // 作者信息
     Contact contact = new Contact("茶碗儿", "https://www.cnblogs.com/chawaner/", "*******@qq.com");
 ​
     return new ApiInfo(
         // 大标题
         "畅购商城",
         // 描述
         "畅购商城在线API",
         // 版本
         "v1.0",
         // 服务组织url
         "https://www.cnblogs.com/chawaner/",
         // 作者信息
         contact,
         // 开源版本号
         "Apache 2.0",
         //// 开源版本url
         "http://www.apache.org/licenses/LICENSE-2.0",
         new ArrayList<VendorExtension>());
  }
 }

3、在JavaBean中加上注解

 @ApiModel(description = "Result", value = "Result")
 @Data // lombok注解
 public class Result<T> implements Serializable {
 ​
   @ApiModelProperty(value = "执行是否成功,true:成功,false:失败", required = true)
   private boolean flag; // 是否成功
 ​
   @ApiModelProperty(value = "返回状态码,20000:成功,20001:失败,20002:用户名或密码错误,20003:权限不足,20004:远程调用失败,20005:重复操作,20006:没有对应的抢购数据", required = true)
   private Integer code; // 返回码
 ​
   @ApiModelProperty(value = "提示信息", required = true)
   private String message; // 返回消息
 ​
   @ApiModelProperty(value = "逻辑数据", required = true)
   private T data; // 返回数据
 ​
   public Result(boolean flag, Integer code, String message, Object data) {
     this.flag = flag;
     this.code = code;
     this.message = message;
     this.data = (T) data;
  }
 ​
   public Result(boolean flag, Integer code, String message) {
     this.flag = flag;
     this.code = code;
     this.message = message;
  }
 ​
   public Result() {
     this.flag = true;
     this.code = StatusCode.OK;
     this.message = "操作成功!";
  }
 }

4、在controller类中加入注解

 @Api(
     value = "用户品牌操作",
     tags = {"用户品牌操作接口"})
 @RestController
 @RequestMapping(value = "/brand")
 @CrossOrigin // 跨域访问:域名、端口、协议不一致
 public class BrandController {
 ​
   @Autowired private BrandService brandService;
 ​
   /** 查询所有 */
   @ApiOperation("查询所有品牌信息")
   @GetMapping
   public Result<List<Brand>> findAll() {
     // 查询所有品牌信息
     List<Brand> brands = brandService.findAll();
     // 响应结果封装
     return new Result<List<Brand>>(true, StatusCode.OK, "查询品牌集合成功!", brands);
  }
 ​
   /** 根据主键id查询 */
   @ApiOperation("据主键id查询") // 接口 放在方法上
   @GetMapping(value = "/{id}")
   public Result<Brand> findById(
       @ApiParam(value = "传入的id") @PathVariable(value = "id") Integer id) {
     Brand brand = brandService.findById(id);
     return new Result<Brand>(true, StatusCode.OK, "根据id查询品牌成功!", brand);
  }
 ​
   /**
    * 增加品牌
    *
    * @param brand
    */
   @ApiOperation("增加品牌")
   @PostMapping
   public Result add(@ApiParam(value = "要增加的品牌信息") @RequestBody Brand brand) {
     brandService.add(brand);
     return new Result(true, StatusCode.OK, "添加品牌成功!");
  }
 ​
   /**
    * 根据ID修改品牌数据
    *
    * @param id
    * @param brand
    * @return
    */
   @ApiOperation("根据ID修改品牌信息")
   @PutMapping(value = "/{id}")
   public Result update(
       @ApiParam(value = "输入的id", example = "1") @PathVariable(value = "id") Integer id,
       @ApiParam(value = "brand") @RequestBody Brand brand) {
     brand.setId(id);
     brandService.update(brand);
     return new Result(true, StatusCode.OK, "根据ID修改品牌成功!");
  }
 ​
   /**
    * 根据ID删除品牌数据
    *
    * @param id
    */
   @ApiOperation("根据ID删除品牌")
   @DeleteMapping(value = "/{id}")
   public Result delete(@ApiParam(value = "输入的id") @PathVariable(value = "id") Integer id) {
     brandService.delete(id);
     return new Result(true, StatusCode.OK, "根据ID删除品牌数据成功!");
  }
 ​
   /** 根据品牌信息多条件搜索 */
   @ApiOperation("根据品牌信息多条件搜索")
   @PostMapping(value = "/search")
   public Result<List<Brand>> findList(@ApiParam(value = "查询条件") @RequestBody Brand brand) {
     List<Brand> brands = brandService.findList(brand);
     return new Result<List<Brand>>(true, StatusCode.OK, "根据品牌信息多条件搜索成功!", brands);
  }
 ​
   /**
    * 分页查询实现
    *
    * @param page:当前页
    * @param size:每页显示条数
    * @return
    */
   @ApiOperation("分页查询实现")
   @GetMapping(value = "/search/{page}/{size}")
   public Result<PageInfo<Brand>> findPage(
       @ApiParam(value = "当前页") @PathVariable(value = "page") Integer page,
       @ApiParam(value = "显示的条数") @PathVariable(value = "size") Integer size) {
     PageInfo<Brand> pageInfo = brandService.findPage(page, size);
     return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页查询成功!", pageInfo);
  }
 ​
   /**
    * 分页查询 + 条件搜索
    *
    * @param brand:搜索条件
    * @param page:当前页
    * @param size:每页显示条数
    * @return
    */
   @ApiOperation("分页查询 + 条件搜索")
   @PostMapping(value = "/search/{page}/{size}")
   public Result<PageInfo<Brand>> findPage(
       @ApiParam(value = "查询条件") @RequestBody Brand brand,
       @ApiParam(value = "当前页") @PathVariable(value = "page") Integer page,
       @ApiParam(value = "显示的条数") @PathVariable(value = "size") Integer size) {
     PageInfo<Brand> pageInfo = brandService.findPage(brand, page, size);
     return new Result<PageInfo<Brand>>(true, StatusCode.OK, "分页查询成功!", pageInfo);
  }
 }

5、配置文件application.yml中配端口号和端口扫描

 注意:
 1.端口号是从浏览器打开swagger-ui时的端口
 2.配置端口扫描是为了设置在开发时开启swagger在线文档,在产品发布后不开启
 3.注意看上面的SwaggerConfig配置类里面的:Profiles profiles = Profiles.of("dev");
 扫描包含dev的配置文件,所以打开ui界面就得18082端口

application.yml

 #端口的配置
 server:
   port: 18081
       
 #设置对dev的端口开启swagger
 #本来是访问http://localhost:18081/swagger-ui.html打开swagger-ui界面
 #配置了这个之后,打开swagger-ui界面就要访问http://localhost:18082/swagger-ui.html
 spring:
   profiles:
     active: dev

application-dev.yml

 server:
   port: 18082

application-pro.yml

 server:
   port: 18083

6、Swagger常用注解

位置 注解 说明
controller @Api 对请求类的说明
方法 @ApiOperation 方法的说明
方法 @ApiImplicitParams、@ApiImplicitParam 方法的参数的说明;@ApiImplicitParams 用于指定单个参数的说明
方法 @ApiResponses、@ApiResponse 方法返回值的说明 ;@ApiResponses 用于指定单个参数的说明
对象 @ApiModel 用在JavaBean类上,说明JavaBean的 用途
对象 @ApiModelProperty 用在JavaBean类的属性上面,说明此属性的的含议

@Api:

@Api:放在 请求的类上,与 @Controller 并列,说明类的作用,如用户模块,订单类等。
tags="说明该类的作用"
value="该参数没什么意义,所以不需要配置"

示例

@Api(tags="订单模块")
@Controller
public class OrderController { }

@Api其他属性配置:

属性名称 备注
value url的路径值
tags 如果设置这个值、value的值会被覆盖
description 对api资源的描述
basePath 基本路径
position 如果配置多个Api 想改变显示的顺序位置
produces 如, “application/json, application/xml”
consumes 如, “application/json, application/xml”
protocols 协议类型,如: http, https, ws, wss.
authorizations 高级特性认证时配置
hidden 配置为true ,将在文档中隐藏

@ApiOperation:

@ApiOperation:"用在请求的方法上,说明方法的作用"
value="说明方法的作用"
notes="方法的备注说明"

@ApiImplicitParams、@ApiImplicitParam:方法参数的说明

@ApiImplicitParams:用在请求的方法上,包含一组参数说明
@ApiImplicitParam:对单个参数的说明
name:参数名
value:参数的说明、描述
required:参数是否必须必填
paramType:参数放在哪个地方
· query --> 请求参数的获取:@RequestParam
· header --> 请求参数的获取:@RequestHeader
· path(用于restful接口)--> 请求参数的获取:@PathVariable
· body(请求体)--> @RequestBody User user
· form(普通表单提交)
dataType:参数类型,默认String,其它值dataType="Integer"
defaultValue:参数的默认值

示例:

@Api(tags="用户模块")
@Controller
public class UserController { @ApiOperation(value="用户登录",notes="随边说点啥")
@ApiImplicitParams({
@ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
@ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
@ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")
})
@PostMapping("/login")
public JsonResult login(@RequestParam String mobile, @RequestParam String password,
@RequestParam Integer age){
//...
return JsonResult.ok(map);
}
}

@ApiResponses、@ApiResponse:方法返回值的状态码说明

@ApiResponses:方法返回对象的说明
@ApiResponse:每个参数的说明
code:数字,例如400
message:信息,例如"请求参数没填好"
response:抛出异常的类

示例:

@Api(tags="用户模块")
@Controller
public class UserController { @ApiOperation("获取用户信息")
@ApiImplicitParams({
@ApiImplicitParam(paramType="query", name="userId", dataType="String", required=true, value="用户Id")
})
@ApiResponses({
@ApiResponse(code = 200, message = "请求成功"),
@ApiResponse(code = 400, message = "请求参数没填好"),
@ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
})
@ResponseBody
@RequestMapping("/list")
public JsonResult list(@RequestParam String userId) {
...
return JsonResult.ok().put("page", pageUtil);
}
}

@ApiModel:用于JavaBean上面,表示对JavaBean 的功能描述

@ApiModel的用途有2个:
当请求数据描述,即 @RequestBody 时, 用于封装请求(包括数据的各种校验)数据;
当响应值是对象时,即 @ResponseBody 时,用于返回值对象的描述。

Swagger在线文档使用教程的更多相关文章

  1. .net core的Swagger接口文档使用教程(二):NSwag

    上一篇介绍了Swashbuckle ,地址:.net core的Swagger接口文档使用教程(一):Swashbuckle 讲的东西还挺多,怎奈微软还推荐了一个NSwag,那就继续写吧! 但是和Sw ...

  2. swagger在线文档和离线文档

    spring boot项目的swagger文档. 依赖从spring boot的基础上增加.参考pom.xml: <dependency> <groupId>org.sprin ...

  3. .net core的Swagger接口文档使用教程(一):Swashbuckle

    现在的开发大部分都是前后端分离的模式了,后端提供接口,前端调用接口.后端提供了接口,需要对接口进行测试,之前都是使用浏览器开发者工具,或者写单元测试,再或者直接使用Postman,但是现在这些都已经o ...

  4. swagger:API在线文档自动生成框架

    传统的API从开发测试开始我们经常借用类似Postman.fiddle等等去做接口测试等等工具:Swagger 为API的在线测试.在线文档提供了一个新的简便的解决方案: NET 使用Swagger ...

  5. 求你别再用swagger了,给你推荐几个在线文档生成神器

    前言 最近公司打算做一个openapi开放平台,让我找一款好用的在线文档生成工具,具体要求如下: 必须是开源的 能够实时生成在线文档 支持全文搜索 支持在线调试功能 界面优美 说实话,这个需求看起来简 ...

  6. Mergely – 免费的在线文档对比和合并工具

    任何类型的文件(无论是否代码),我们可能要比较不同的版本,看发生了什么变化. 有些编辑器都有这个内置功能,其中一些则没有. Mergely 是一个免费使用的 Web 应用程序,帮你你迅速作出文档的差异 ...

  7. 添加swagger api文档到node服务

    swagger,一款api测试工具,详细介绍参考官网:http://swagger.io/ ,这里主要记录下怎么将swagger api应用到我们的node服务中: 1.任意新建node api项目, ...

  8. SpringBoot整合Swagger2搭建API在线文档

    Swagger,中文"拽"的意思,它是一个功能强大的在线API在线文档,目前它的版本为2.x,所以称为Swagger2.Swagger2提供了在线文档的查阅和测试功能.利用Swag ...

  9. swagger接口文档

    1 在Visual Studio 中创建一个Asp.NET  WebApi 项目,项目名:Com.App.SysApi(本例创建的是 .net 4.5 框架程序) 2  打开Nuget 包管理软件,查 ...

随机推荐

  1. ClouderaManager安装kafka报错

    是因为默认的java heap size是50M,将broker_max_heap_size参数设置为512M后,重启kafka服务即可

  2. C#下通过wbemtest和WMI Code Cretor更加高效的访问WMI

    能找到这篇博客的,相信都是有操作WMI需求的了.但是不知道如何快速验证.并集成到C#来操作WMI.我们分为3步: ##第一步:官网(或跟硬件开发WMI的人沟通你需要的接口和参数定义,如果是和硬件开发的 ...

  3. Hive源码上手及问题解决

    一.编译准备 1.下载源码包 https://github.com/apache/hive/archive/refs/tags/rel/release-2.3.7.zip 或使用git直接拉取 无法解 ...

  4. 高校表白App-团队冲刺第十天

    今天要做什么 做一个类似于淘宝的小云播报 做了什么 没有完全实现,轮转实现,功能没有 遇到的问题 遇到的问题好多啊,感觉写一天都写不完,我还是好好学习一下再重新写吧

  5. python + mysql 实现表删除数据

    实例如下: import pymysqldef Delete_From(): #打开数据库链接 db = pymysql.connect("localhost","roo ...

  6. python -- 程序异常与调试(程序调试)

    一.程序调试 A.使用assert语句检测程序代码中的错误. assert 表达式[, 参数] 如果表达式为True,则继续往下运行:如果为False,则抛出一个AssertionError异常,并且 ...

  7. python -- 面向对象编程(属性、方法)

    一.属性 对象的属性(attribute)也叫做数据成员(data member). 如果想指向某个对象的属性,可以使用格式: object.attribute 属性又分为:私有属性和公有属性. 私有 ...

  8. 算法leetcode二分算法

    二分算法通常用于有序序列中查找元素: 有序序列中是否存在满足某条件的元素: 有序序列中第一个满足某条件的元素的位置: 有序序列中最后一个满足某条件的元素的位置. 思路很简单,细节是魔鬼. 一.有序序列 ...

  9. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  10. 技术期刊 · 天光台高未百尺 | Uber 工程师的 JS 算法课;大数据时代的个人隐私;设计师的 Github;告别 PPT 工程师;从零开始实现的像素画

    蒲公英 · JELLY技术期刊 Vol.42 这是一个最好的时代,多样化的平台给了所有人成长发展的机会,各种需求和解决需求的人让人大开眼界:但这也并不是完美的时代,"前端还需要懂什么算法?& ...