百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

SpringBoot 优雅整合Swagger Api 自动生成文档

liuian 2025-02-26 12:45 9 浏览

一个好的可持续交付的项目,项目说明,和接口文档是必不可少的,swagger api 就可以帮我们很容易自动生成api 文档,不需要单独额外的去写,无侵入式,方便快捷大大减少前后端的沟通方便查找和测试接口提高团队的开发效率方便新人了解项目,剩余的时间就可以去约妹子啦

整合swagger api#

这里我们自己去整合swagger api比较麻烦,要导入好几个包,有大神帮我们写好了轮子kinfe4j直接对应SpringBoot的启动项,而且在不影响原来使用功能上界面ui做了美化功能做了增强 我们直接整合这个就好了

        
        
            com.github.xiaoymin
            knife4j-spring-boot-starter
            3.0.1
        

正如官网所说

kinfe4j官方文档点击这里

自定义配置信息#

为我们为swagger配置更多的接口说明

package cn.soboys.core.config;

import cn.hutool.core.collection.CollUtil;
import cn.soboys.core.ret.ResultCode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.ResponseBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.Response;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;

/**
 * @author kenx
 * @version 1.0
 * @date 2021/6/21 16:02
 * api 配置类
 */
@Configuration
public class SwaggerConfigure {
    @Resource
    private SwaggerProperty swaggerProperty;

    /**
     * 构造api 文档
     * @return
     */
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30).globalResponses(HttpMethod.POST, this.responseList()) //全局respons信息
                .apiInfo(apiInfo(swaggerProperty))  //文档信息
                .select()
                //文档扫描
                //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))  //有ApiOperation注解的controller都加入api文档
                .apis(RequestHandlerSelectors.basePackage(swaggerProperty.getBasePackage())) //包模式
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo(SwaggerProperty swagger) {
        return new ApiInfoBuilder()
                //标题
                .title(swagger.getTitle())
                //描述
                .description(swagger.getDescription())
                //创建联系人信息 (作者,邮箱,网站)
                .contact(new Contact(swagger.getAuthor(), swagger.getUrl(), swagger.getEmail()))
                //版本
                .version(swagger.getVersion())
                //认证
                .license(swagger.getLicense())
                //认证协议
                .licenseUrl(swagger.getLicenseUrl())
                .build();
    }

    /**
     * 全局response 返回信息
     * @return
     */
    private List responseList() {
        List responseList = CollUtil.newArrayList();
        Arrays.stream(ResultCode.values()).forEach(errorEnum -> {
            responseList.add(
                    new ResponseBuilder().code(errorEnum.getCode().toString()).description(errorEnum.getMessage()).build()
            );
        });
        return responseList;
    }
}

抽出api文档配置模版信息为属性文件方便复用


package cn.soboys.core.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;

/**
 * @author kenx
 * @version 1.0
 * @date 2021/6/21 16:01
 * api 文档信息
 */
@Data
@SpringBootConfiguration
public class SwaggerProperty {
    /**
     * 需要生成api文档的 类
     */
    @Value("${swagger.basePackage}")
    private String basePackage;
    /**
     * api文档 标题
     */
    @Value("${swagger.title}")
    private String title;
    /**
     * api文档 描述
     */
    @Value("${swagger.description}")
    private String description;
    /**
     * api文档 版本
     */
    @Value("${swagger.version}")
    private String version;
    /**
     * api  文档作者
     */
    @Value("${swagger.author}")
    private String author;
    /**
     * api 文档作者网站
     */
    @Value("${swagger.url}")
    private String url;
    /**
     * api文档作者邮箱
     */
    @Value("${swagger.email}")
    private String email;
    /**
     * api 文档 认证协议
     */
    @Value("${swagger.license}")
    private String license;
    /**
     * api 文档 认证 地址
     */
    @Value("${swagger.licenseUrl}")
    private String licenseUrl;
}

简单使用#

在你的Controller上添加swagger注解

@Slf4j
@Api(tags = "登录")
public class LoginController {
    private final IUsersService userService;

    @PostMapping("/login")
    @ApiOperation("用户登录")
    public String login(@RequestBody UserLoginParams userLoginParams) {
        Users u = userService.login(userLoginParams);
        return "ok";
    }
}

注意如启用了访问权限,还需将swagger相关uri允许匿名访问

/swagger**/**
/webjars/**
/v3/**
/doc.html

重启服务,自带api文档访问链接为/doc.html界面如下:


相比较原来界面UI更加漂亮了,信息更完善功能更强大

Swagger常用注解#

Api标记#

用在请求的类上,表示对类的说明,也代表了这个类是swagger2的资源

参数:

  1. tags:说明该类的作用,参数是个数组,可以填多个。
  2. value="该参数没什么意义,在UI界面上不显示,所以不用配置"
  3. description = "用户基本信息操作"

ApiOperation标记#

用于请求的方法上表示一个http请求的操作

参数:

  1. value用于方法描述
  2. notes用于提示内容
  3. tags可以重新分组(视情况而用)

ApiParam标记#

用于请求方法上对请求参数,字段说明;表示对参数的添加元数据(说明或是否必填等)

参数:

  1. name–参数名
  2. value–参数说明
  3. required–是否必填

ApiModel标记#

用于java实体类上表示对类进行说明,用于参数用实体类接收

参数:

  1. value–表示对象名
  2. description–描述
    都可省略

ApiModelProperty标记#

用于方法,字段; 表示对model属性的说明或者数据操作更改

参数:

  1. value–字段说明
  2. name–重写属性名字
  3. dataType–重写属性类型
  4. required–是否必填
  5. example–举例说明
  6. hidden–隐藏
@ApiModel(value="user对象",description="用户对象user")
public class User implements Serializable{
    private static final long serialVersionUID = 1L;
     @ApiModelProperty(value="用户名",name="username",example="xingguo")
     private String username;
     @ApiModelProperty(value="状态",name="state",required=true)
      private Integer state;
      private String password;
      private String nickName;
      private Integer isDeleted;
 
      @ApiModelProperty(value="id数组",hidden=true)
      private String[] ids;
      private List idList;
     //省略get/set
}

ApiIgnore标记#

用于请求类或者方法上,可以不被swagger显示在页面上

ApiImplicitParam标记#

用于方法表示单独的请求参数

ApiImplicitParams标记#

用于方法,包含多个 @ApiImplicitParam

参数:

  1. name–参数名
  2. value–参数说明
  3. dataType–数据类型
  4. paramType–参数类型
  5. example–举例说明
  @ApiOperation("查询测试")
  @GetMapping("select")
  //@ApiImplicitParam(name="name",value="用户名",dataType="String", paramType = "query")
  @ApiImplicitParams({
  @ApiImplicitParam(name="name",value="用户名",dataType="string", paramType = "query",example="xingguo"),
  @ApiImplicitParam(name="id",value="用户id",dataType="long", paramType = "query")})
  public void select(){
 
  }

总结#

  1. 可以给实体类和接口添加注释信息
  2. 接口文档实时更新
  3. 在线测试
  4. kinfe4j 在swagger API只做增强,不会改变原有任何使用,更多增加使用功能
    点击这里进入kinfe4j官网文档

相关推荐

HR必备Excel函数:4个与日期相关的计算函数。

提到日期函数,很多人首先会想到“today”,它可以显示当天的日期,并且每次打开表格时都会自动更新。但是,对于前天、昨天、明天和后天的日期,就不能用yesterday或者tomorrow等这些英文了,...

这篇文章有点长,但可以让你十分钟玩转Excel的时间函数

日期与时间函数——TODAY、NOW、YEAR、MONTH、DAY!如何用WORKDAY函数查询距离某天的第20个工作日是哪一天?如何用NETWORKDAYS函数查询员工工作了多少个工作日?如何用WE...

Excel2020年日历套装,表格设计,农历显示,查阅套打轻松应用

Hello大家好,我是帮帮。今天跟大家分享一组Excel2020年日历套装,表格设计,自带农历控件,查阅套打轻松应用。有个好消息!为了方便大家更快的掌握技巧,寻找捷径。请大家点击文章末尾的“了解更多”...

巧用NETWORKDAYS函数计算两个日期之间工作日的天数

带有日期的单元格是我们日常使用EXCEL的时候经常见到的,有的时候我们需要求出两个日期之间间隔的天数,可以直接用结束日期减去开始日期即可,这是个非常简单的减法公式。不过这个单纯的减法公式会默认去掉开始...

Excel按工作日、休息日进行汇总

1、按周六日/其它时间汇总为了区分一周的周六日和其它时间,可以使用WEEKDAY函数,把WEEKDAY函数的第2个参数指定为2,如WEEKDAY(A3,2),则周一返回1,周二返回2,…,周六返回...

如何计算每月应出勤天数,如有法定假期和调休,如何计算

本文介绍如何计算每月的应出勤天数。第一部分介绍正常双休制下计算应出勤天数;第二部份介绍当月有法定假期和调休的情况下计算应出勤天数。一、计算正常双休制的应出勤天数如下图所示,要求计算各员工2021年3月...

《Excel一键生成工作日历:让会议排期更轻松!》

每当需要安排会议时,总要翻看日历确认工作日,再逐个标注会议时间,既耗时又容易出错。今天教大家用Excel快速生成工作日历表,让会议排期变得简单高效!一、快速生成日历框架创建基础日期:在A1单元格输入月...

如何计算指定日期区间内,有多少工作日和休息日?

大家好,今天咱们要解决的问题是如何计算给定的一段日期内,正常工作日有多少天,放假时间有多少天?比如咱们要计算2025年3月份工作日一共有多少天,又有多少天放假,如下图所示:通过肉眼我们可以数清楚,20...

如何如何在表格中自动突出显示双休日?

现在不少人喜欢用Excel来制作备忘录或安排工作事项。在表格中输入日期后,可以使用条件格式突出显示双休日,避免在休息日安排了工作。具体方法是这样的:第1步:选择要设置条件格式的日期单元格区域;在“开始...

excel函数技巧:networkdays.intl判断节假日

如图,想知道6月的每一天是否是节假日,公式如下:=NETWORKDAYS.INTL(A2,A2,1,$E$2:$E$28)这个函数既可以判断当前日期(一参=二参)是否是周末及工作日(三参、四参)还可得...

仅需3步,让考勤表根据实际休息日,自动地填充颜色

Hello,大家好,之前跟大家分享了我们如何让考勤表根据单休与双休自动的填充颜色,最近有粉丝问到:能不能让考勤表根据实际的休息日自动的填充颜色呢?可以是可以,只不过因为牵扯到假期调休,我们每年的休息日...

5步搞定动态考勤表!标记节假日、调休日?Excel自动变色!

今天教你用「动态考勤表」一招解决所有问题!只需输入月份,自动变色、自动更新节假日,从此告别加班,效率翻倍!动态考勤表的优势:自动变色:节假日、双休日一键标记,颜色分明。一表多用:修改月份即可...

一起用python做个炫酷音乐播放器,想听啥随便搜

前言前段时间写的Python自制一款炫酷音乐播放器,有不少小伙伴私信我,对播放器提了不少改进建议,让我完善播放器的功能。今天音乐播放器2.0版本完成了,大家一起来看看是如何用python自制一款炫酷的...

用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)

桌面太单调?今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果!下面,我们开始介绍这个自定义桌面动画挂件的制作过程。一、核心功能设计实现将动态图gif...

Python串口调试助手源码分享

以下是一个基于Python和PyQt5实现的串口调试助手示例,包含核心功能实现代码:pythonimportsysimportserialfromPyQt5.QtCoreimportQTim...