概述

首先让我引用 Swagger 官方的介绍:

Design is the foundation of your API development. Swagger makes API design a breeze, with easy-to-use tools for developers, architects, and product owners.

设计是API开发的基础。Swagger使API设计变得轻而易举,为开发人员,架构师和产品所有者提供了易于使用的工具。

作为一个后端开发者,你是否为开发完 API 接口后为写文档而烦恼、当 App 开发人员或前端开发人员看不懂的你写的接口文档,你还得去给他们讲一遍怎么使用而烦恼。

使用 Swagger 这些烦恼统统的消失,Swagger一个集预览和测试于一身的在线可视化 RESTful 风格的 Web 服务框架。

闲话少说,直接开整!

基础配置和 API 接口开发

第一步:先引入Swagger starter 依赖到 pom 文件中。我们这里采用2.7.0 版本

<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>

还有一点需要注意的是必须引入 Spring Boot Web starter 依赖。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

第二步:编写 RESTful API 服务:一个用户的增删改查。

public class User {

        private String name;
        private Integer age;
        //......省略get and set方法
}

定义用户 RESTFull API 服务 Controller。

@RestController()
@RequestMapping("/user")
public class UserController {
//......
}

在 RESTFull API 服务 Controller 添加根据 id查询用户的接口


    /**
     * 根据用户id 查询用户
     * @return
     */
    @GetMapping("/{id}")
    public User get(@PathVariable(name = "id") Long id){
        User user = new User();
        user.setName("lijunkui");
        user.setAge(18);
        log.info("springboot查询用户成功:"+"id:{}",id);
        return user;
    }

定义添加用户接口。

/**
     * 添加用户
     */
    @PostMapping()
    public void add(User user){
        log.info("springboot添加用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
    }

定义更新用户接口。

 /**
     * 全部更新
     * @param user
     */
    @PutMapping()
    public void updatePut(User user){
        log.info("springboot Put 修改用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
     }

定义 局部更新用户接口。

 /**
     * 局部更新
     */
    public void updatePatch(@PathVariable("name") String name){
        log.info("springboot Patch 修改用户成功:"+"name:{}",name);
    }

定义删除用户接口。

  /**
     * 删除用户
     */
    @DeleteMapping("/{id}")
    public void delete(@PathVariable("id") Long id){
        User user = new User();
        user.setName("lijunkui");
        user.setAge(18);
        log.info("springboot 删除用户成功:"+"id:{}",id);
    }

定义根据 json 数据更新用户接口。

 /**
     * 根据requestBody 更新用户信息
     * @param user
     * @return
     */
    @PostMapping("/updateUserByRequestBody")
    public void updateUserByRequestBody(@RequestBody User user){
        log.info("updateUserByRequestBody 修改用户成功:"+"name:{},age:{}",user.getName(),user.getAge());
    }

第三步:编写 Swagger 的Config配置类


//让Spring来加载该类配置
@Configuration
//是否禁用swagger 的配置
@ConditionalOnProperty(prefix = "swagger",value = {"enable"},havingValue = "true")
//启用Swagger2
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket alipayApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("简单用户管理API接口文档")
                .apiInfo(apiInfo())
                .select()
 //扫描配置 classpath 路径配置 Swagger注解下的 Api文档。 .apis(RequestHandlerSelectors.basePackage("com.ljk.springBootLearn.users"))
                .paths(PathSelectors.any()).build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SprignBoot学习专栏")
                .description("集成swagger")
                .termsOfServiceUrl("https://blog.csdn.net/ljk126wy")
                //创建人
                .contact(new Contact("桌前明月", "http://www.baidu.com", ""))
                //版本
                .version("1.0")
                //API 描述
                .description("简单介绍如有问题还望指正")//
                .build();
    }
}

我来简单介绍一下 Swagger 的配置类中方法使用介绍。

每一组 Controller 的 Api 都对应一个 Docket 配置 ,如果有多个组 Api 就应该配置多个Docket 的 Bean。

Docket.groupName(String name):配置接口分组的名称,name为分组的名称。对应下图中红色框中的信息

apiInfo(ApiInfo apiInfo ) 配置Api 文档的一些公共的描述信息,对应下图中红色框中的信息。


paths():配置需要显示具体 Api 的路径。

我们通过PathSelectors类的4个方法来进行判断

  1. PathSelectors.any(): 所有的api都显示
  2. PathSelectors.none(): 所有的路径都不显示
  3. PathSelectors.regex(String pathRegex): 按照String的matches方法进行匹配。例如:PathSelectors.regex("/user/*")
  4. PathSelectors.ant(String antPattern): 按照Spring的AntPathMatcher提供的match方法进行匹配 例如:PathSelectors.ant("/user/**")

AntPathMatcher.match(String pattern, String path) 可以做URLs匹配,规则如下

?匹配一个字符

*匹配0个或多个字符

** 匹配0个或多个目录

第四步:在application.properties 或 application.yml中添加配置信息。
在application.properties 配置信息如下:

server.port=8080
server.servlet.context-path=/sbe
swagger.enable = true
application.yml 配置内容如下:

application.yml 配置信息如下:

server:
  port: 8080 #游览器访问项目端口号
  servlet:
    context-path:/sbe #游览器访问项目的名称
swagger:
  enable: true

需要注意的是application.properties 或 application.yml 只能存在一个,swagger.enable =
true表示是否使用Swagger的的功能。主要用于生产环境和开发环境的配置。切记生产环境要配置成false。

到目前为止SpringBoot 整合 Swagger 基础部分搭建完毕!接下来让我们今天的重点 Swagger 配置注解。

Swagger 注解使用实战

@Api : 说明接口类的作用。

@Api(tags ="用户管理")
@RestController()
@RequestMapping("/user")
public class UserController {
}

访问 Swagger UI 界面如下:


@ApiOperation: 用在方法上 说明方法的作用。

    @ApiOperation(value="根据id获取用户信息")
    @GetMapping("/{id}")
    public User get(@PathVariable(name = "id") Long id){
      //省略逻辑代码
    }

访问 Swagger UI 界面如下:

@ApiImplicitParam: 方法中参数的说明

 /**
     * 根据用户id 查询用户
     * @return
     */
    @ApiImplicitParam(paramType= "path", name = "id", value = "用户id", required = true, dataType = "Long")
    @GetMapping("/{id}")
    public User get(@PathVariable(name = "id") Long id){
       //省略逻辑代码
    }

访问 Swagger UI 界面如下:

@ApiImplicitParams(): 配置多个ApiImplicitParam


    @ApiImplicitParams({

@ApiImplicitParam(name="name",value="用户名",dataType="string", required = true, paramType = "form",example="ljk"),
@ApiImplicitParam(name="age",value="用户年龄",dataType="int", paramType = "form")})

    @PostMapping()

    public void add(User user){
      //省略逻辑代码
    }

访问 Swagger UI 界面如下:

@ApiModel: 描述返回实体类信息

@ApiModel(value="user对象",description="用户对象user")
public class User {
}

@ApiModelProperty: 描述返回实体类属性的信息

public class User {
    @ApiModelProperty(value="用户名",name="name",example="xingguo")
    private String name;
    @ApiModelProperty(value="年龄1",name="age",required=true)
    private Integer age;
}

访问 Swagger UI 界面如下:

@ApiResponse: 错误相应信息描述
@ApiResponses: 描述多个错误信息


    @GetMapping("/{id}")
    @ApiResponses({ @ApiResponse(code = 400, message = "请求无效 (Bad request)") })
    public User get(@PathVariable(name = "id") Long id){
     //省略逻辑代码
    }

访问 Swagger UI 界面如下:


@ApiParam: 用于声明通过request接受的参数。
@ApiIgnore(): 忽略的字段不显示在api文档中。

public void logon(
@ApiParam(name="loginName",value="登录名称",required=true)
@RequestParam String loginName,
@ApiParam(name="password",value="密码",required=true)
@RequestParam String password,
@ApiIgnore()Model model,HttpServletRequest request){
}

启动 SpringBoot 项目访问:localhost:8080/sbe/swagger-ui.html 如下图所示:

我们可以在如下图中的 name 和 age 输入框中输入内容并进行测试,这里就不一个个进行测试啦。

小结

SpringBoot 整合 Swagger 需要通过SpringBoot Java Config的方式配置 Api 接口扫描的路径、接口组介绍、接口版本、接口描述等信息。接下来就是 Swagger 的具体配置注解,常用的配置注解如下:

@Api :说明接口类的作用。

@ApiOperation:用在方法上 说明方法的作用。

@ApiImplicitParam:方法中参数的说明。

@ApiImplicitParams():配置多个 ApiImplicitParam

@ApiModel:描述返回实体类信息。

@ApiModelProperty:描述返回实体类属性的信息。

@ApiResponse:错误相应信息描述。

@ApiResponses:描述多个错误信息。

@ApiParam:用于声明通过request接受的参数。

@ApiIgnore():忽略的字段不显示在api文档中。

如果你还没有操作过,可以跟着博客敲一遍哈!

代码示例

文中的代码可以参考我的 GitHub 仓库名称 springbootexamples 中的 spring-boot-2.x-swagger 进行查看

GitHub:https://github.com/zhuoqianmingyue/springbootexamples

示例程序环境版本:

SpringBoot Version:2.1.0.RELEASE
SpringMVC Version:5.1.2RELEASE
Maven Version:3.2.5
JDK Version:1.8.0_144

玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)的更多相关文章

  1. 玩转 SpringBoot 2 快速整合 | JSP 篇

    前言 JavaServer Pages(JSP)技术使Web开发人员和设计人员能够快速开发和轻松维护利用现有业务系统的信息丰富的动态Web页面. 作为Java技术系列的一部分,JSP技术可以快速开发独 ...

  2. 玩转 SpringBoot 2 快速整合拦截器

    概述 首先声明一下,这里所说的拦截器是 SpringMVC 的拦截器 HandlerInterceptor.使用SpringMVC 拦截器需要做如下操作: 创建拦截器类需要实现 HandlerInte ...

  3. 玩转 SpringBoot 2 快速整合 | FreeMarker篇

    FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...

  4. 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇

    前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...

  5. 玩转 SpringBoot 2 快速整合 Filter

    概述 SpringBoot 中没有 web.xml, 我们无法按照原来的方式在 web.xml 中配置 Filter .但是我们可以通过 JavaConfig(@Configuration +@Bea ...

  6. 玩转 SpringBoot 2 之整合 JWT 下篇

    前言 在<玩转 SpringBoot 2 之整合 JWT 上篇> 中介绍了关于 JWT 相关概念和JWT 基本使用的操作方式.本文为 SpringBoot 整合 JWT 的下篇,通过解决 ...

  7. 使用Springboot + Gradle快速整合Mybatis-Plus

    使用Springboot + Gradle快速整合Mybatis-Plus 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] MyBatis-Plus(简称 MP)是一个 MyBatis ...

  8. 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  9. 玩转 SpringBoot 2 之整合 JWT 上篇

    前言 该文主要带你了解什么是 JWT,以及JWT 定义和先关概念的介绍,并通过简单Demo 带你了解如何使用 SpringBoot 2 整合 JWT. 介绍前在这里我们来探讨一下如何学习一门新的技术, ...

随机推荐

  1. 一份关于.NET Core云原生采用情况调查

    调查背景 Kubernetes 越来越多地在生产环境中使用,围绕 Kubernetes 的整个生态系统在不断演进,新的工具和解决方案也在持续发布.云原生计算的发展驱动着各个企业转向遵循云原生原则(启动 ...

  2. Angular JS 中的内置方法之filter

    通过过滤器可以实现很多数据格式化的功能 常用方法形如{{ data | uppercase}} 或者是{{ 123.456 | number:2 }} 也可以通过在控制器中注入$filter来实现功能 ...

  3. Django使用本机IP无法访问,使用127.0.0.1能正常访问

    使用Django搭建web站点后,使用127.0.0.1能访问,但是用自己本机IP却无法访问. 我们先到Django项目中找到setting文件 找到——> ALLOWED_HOSTS = [] ...

  4. 什么是redis的缓存雪崩与缓存穿透

    今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1 什么是缓存雪崩? 首先我们先来回答一下我们为什么要用缓 ...

  5. 从源码看java线程状态

    关于java线程状态,网上查资料很混乱,有的说5种状态,有的说6种状态,初学者搞不清楚这个线程状态到底是怎么样的,今天我讲一下如何看源码去解决这个疑惑. 直接上代码: public class Thr ...

  6. spark shuffle写操作三部曲之BypassMergeSortShuffleWriter

    前言 再上一篇文章 spark shuffle的写操作之准备工作 中,主要介绍了 spark shuffle的准备工作,本篇文章主要介绍spark shuffle使用BypassMergeSortSh ...

  7. Activity 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  8. java支付宝app支付-代码实现

    1.我们需要在支付宝商户平台配置好,取到四个参数如下(这是支付宝官方配置地址):https://www.cnblogs.com/fuzongle/p/10217144.html 合作身份者ID:123 ...

  9. 谈谈我对Ext的认识,元芳,你怎么看

    实用Ext第一步当然是引用jar包啦. 下载地址 在页面上加上div用于显示这也是必须的 <div id='loginpanel' ></div> 在js中我们肯定需要将Ext ...

  10. 记一次解决tomcat自动关闭的bug

    最近一个运行了4年的javaee web项目,经常接到客户反馈系统无法打开.登录服务器查看服务,发现是tomcat自动关闭了.基本是3到4天发生一次. 运维人员开始以为是其他服务杀死了tomcat服务 ...