swagger实现在线接口文档

news2024/10/5 19:09:26

一、前言

之前换了新的单位后,单位的项目有使用到swagger,那个时候觉得这个好方便,后面是建立在他们搭建好的基础上使用一些swagger的注解,但一直想要自己去实现,奈何没有机会,这次机会终于来了,完成从0开始,虽然说这个不难,但之前自己没有搭建过,还是遇到了一点问题,好在站在了巨人的肩膀上把问题解决了。

当然如果不使用swagger也可以直接在word中编写接口文档,接口文档主要是给产品,测试,前端看的,由后端同学去维护。

二、本次的参考博客

https://blog.csdn.net/hlx20080808/article/details/120204111
NPE问题的解决

感谢大神!感兴趣的也去看下第一篇文档,第二篇是解决问题的。

三、swagger接口文档

前提条件:我使用的springboot的版本是2.7.7,jdk版本是11

3.1 SpringFox介绍

我这里使用的是SpringFox,它是 spring 社区维护的一个非官方的开源的API Doc的框架,Marty Pitt编写了一个基于Spring的组件swagger-springmvc,用于将swagger集成到springmvc中来, 它的前身是swagger-springmvc,可以将我们的Controller中的方法以文档的形式展现。

地址:https://github.com/springfox/springfox

SpringFox 3.0.0 发布(突破性的变更版本),支持OpenApi 3.0.3,有springboot的整合的starter,使用更便捷
基于OpenAPi规范-新版SpringBoot2.x整合Swagger3.x

3.2 SpringBoot添加pom文件依赖

<dependency>
	<groupId>io.springfox</groupId>
	<artifactId>springfox-boot-starter</artifactId>
	<version>3.0.0</version>
</dependency>

3.3 swagger的配置类

import io.swagger.annotations.ApiOperation;
import lombok.Data;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
import org.springframework.boot.actuate.endpoint.web.*;
import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *<a href="http://localhost:8081/swagger-ui/index.html#/"> swagger访问地址</a>
 */
@Component
@Data
@ConfigurationProperties("swagger")  //配置swagger.enable的前缀
@EnableOpenApi
public class SwaggerConfiguration {
    /**
     * 是否开启swagger,生产环境一般关闭,所以这里定义一个变量
     */
    private Boolean enable;
    /**
     * 项目应用名
     */
    private String applicationName = "access-control";
    /**
     * 项目版本信息
     */
    private String applicationVersion = "1.0";
    /**
     * 项目描述信息
     */
    private String applicationDescription = "智能门禁系统:API接口文档";
    //第一个 Docket,每一个Docket描述一组文档
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(enable)
                .apiInfo(new ApiInfoBuilder()
                        .title(applicationName)
                        .description(applicationDescription)
                        .version(applicationVersion)
                        .build())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .build();
    }
    /**
     * 增加如下配置可解决Spring Boot 6.x 与Swagger 3.0.0 不兼容问题
     **/
    @Bean
    public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
                                                                         ServletEndpointsSupplier servletEndpointsSupplier,
                                                                         ControllerEndpointsSupplier controllerEndpointsSupplier,
                                                                         EndpointMediaTypes endpointMediaTypes,
                                                                         CorsEndpointProperties corsProperties,
                                                                         WebEndpointProperties webEndpointProperties,
                                                                         Environment environment) {
        List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
        Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
        allEndpoints.addAll(webEndpoints);
        allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
        allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
        String basePath = webEndpointProperties.getBasePath();
        EndpointMapping endpointMapping = new EndpointMapping(basePath);
        boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
        return new WebMvcEndpointHandlerMapping(endpointMapping,
                webEndpoints, endpointMediaTypes,
                corsProperties.toCorsConfiguration(),
                new EndpointLinksResolver(allEndpoints, basePath),
                shouldRegisterLinksMapping, null);
    }
    private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
        return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath)
                || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
    }
}

此配置类中有一个方法:webEndpointServletHandlerMapping,也就是我在第二部分提到的解决NPE问题的方法,同时需要在application.properties中增加配置:

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

如果删除了webEndpointServletHandlerMapping方法和spring.mvc.pathmatch.matching-strategy=ant_path_matcher 配置的话就会出现这个bug:
在这里插入图片描述

配置类中有个enable的属性,这个值也是在application.properties定义的

swagger.enable=true

用来控制swagger是否可用的。

3.4 使用

3.4.1 controller上使用

在这里插入图片描述

3.4.2 请求参数类上使用

在这里插入图片描述
基本上我画红框的这四个注解就足够用了,当然还有一些其他的注解,感兴趣的可以自己搜一下,也可以先参考这篇文档

3.5 页面访问

我的springboot的端口是8081,启动服务之后,访问:http://localhost:8081/swagger-ui/index.html

在这里插入图片描述
由于我这个只写了POST,如果还有其他的请求方式就是不同的颜色了。

3.6 使用方法

在每一个请求下面都一个Try it out,如果没有请求参数直接访问,有参数就输入参数,就可以直接访问本地进行自测了。当然部署到test环境的话就是对应的IP地址端口或域名在拼接/swagger-ui/index.html就可以访问了,生产环境是不可以访问的,这个时候就是把swagger.enable的值改为false就可以了。
在这里插入图片描述
-----------你知道的越多,不知道的越多---------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/636390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《楚天法治》期刊简介及投稿邮箱

《楚天法治》期刊简介及投稿邮箱 《楚天法治》杂志为半月刊&#xff0c;是一本以关注法制热点、推进法治建设、促进法治社会和谐发展为宗旨的法制类专业期刊。 主管单位&#xff1a;湖北日报传媒集团 主办单位&#xff1a;湖北日报楚天传媒&#xff08;集团&#xff09;有限…

解析kubernetes部署:微信配置文件部署

微信安全配置文件 以下两步二选一 一、暂时没有微信配置文件 1、创建configmap kubectlcreateconfigmapweixin-config--from-file/opt/kubernetes/weixin/weixin-mp.txt--namespacens-javashop 2、创建微信配置文件service(执行如下命令) kubectlcreate-f/opt/kubernetes/weix…

魅族20 INFINITY首销在即:比魅族20 Pro贵2200元,究竟有啥区别?

这两天又有一款高端手机要开售了&#xff0c;这款手机就是魅族20 INFINITY无界版&#xff0c;手机其实早早就已经发布&#xff0c;只不过一直没开售。从配置来说&#xff0c;这款手机也是采用了骁龙8 Gen2芯片&#xff0c;目前只有12GB256GB版一个规格&#xff0c;和魅族20 Pro…

WPF开发txt阅读器7:自定义文字和背景颜色

文章目录 添加控件具体实现代码说明 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定书籍管理系统&#x1f48e;用树形图管理书籍 添加控件 除了字体、字体大小之外&#xff0c;文字和背景颜色也会影响阅读观感&#xff0c…

k8s中的PVC为何需要延迟绑定?(WaitForFirstConsumer)

文章目录 背景为什么需要延迟绑定延迟绑定的原理storgeageClass yaml配置 背景 有一个pod, 使用的pvc叫pvc-1&#xff0c; 我们希望它只运行在node-2上&#xff0c;在当前的集群中存在两台主机符合pod的pvc的要求, 假如node-1上是pv-1&#xff0c; node-2上是pv-2&#xff0c;…

stm32读取DHT11温湿度传感器

stm32读取DHT11温湿度传感器 一.序言二.DHT11响应数据格式三.DHT11通讯过程3.1 产生起始信号3.2 读取数据03.3 读取数据1DHT11停止信号 四.代码实例4.1读取DHT11源文件4.2 读取DHT11头文件 五.结语5.1 总结整体思路5.2 对读者的期望 一.序言 我们知道DHT11是单总线协议&#x…

单体、SOA、微服务的介绍

本文涉及的内容以及知识点如下&#xff1a; 1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 目录 单体架构单体架构的拆分 SOA与微服务 微服务的优缺点微服务消息服务集成数据去中心化 单体架构 Web应用…

springboot+vue.js汽车销售网站il05r

本靓车汽车销售网站管理员功能有个人中心&#xff0c;用户管理&#xff0c;车辆展示管理&#xff0c;车辆品牌管理&#xff0c;车辆型号管理&#xff0c;维修材料管理&#xff0c;材料分类管理&#xff0c;用户交流&#xff0c;留言板管理&#xff0c;系统管理&#xff0c;订单…

国产openeuler22.03容器环境下固定容器IP的实例

Docker 中默认的容器网络为名为bridge的桥接网络&#xff0c;使用DHCP协议&#xff0c;不能固定容器IP&#xff0c;每次重启&#xff0c;容器的IP是按其启动顺序来分配的&#xff0c;单宿主机多容器时&#xff0c;容器的IP就会发生变化&#xff0c;不利于程序 连接及安全加固配…

Ada Tutorial(1):Ada基础——wordcount程序

文章目录 Ada 常用的库和方法Ada.Characters.Handling字符类型函数转换函数 Ada 基础语法概览数据类型和子类型类型&#xff08;Type&#xff09;子类型&#xff08;Subtype&#xff09;类型和子类型的区别常用类型转换方法显示类型转换类型相关函数 循环语句无条件循环 (Loop)…

探索智慧档案的发展路径,开源网安受邀参加国际档案日专题讲座

近日&#xff0c;深圳市档案学会举办了“奋进新征程&#xff0c;兰台谱新篇”2023年国际档案日专题讲座。开源网安常务副总经理王颉博士受邀参加此次讲座&#xff0c;分享了《档案信息安全实务&#xff1a;时代与展望》&#xff0c;从软件供应链安全的维度为到场人员讲解了数字…

Vue3 ElementPlus Dialog封装 (一:使用props emit)

引言 多个页面中需要录入用户数据&#xff08;弹窗内容相同&#xff09;&#xff0c;重复写弹窗代码比较繁琐。因此封装一下组件&#xff0c;使用效果如下&#xff1a; 本例中模型较简单&#xff0c;记录下使用方法和原理 实现原理 参考VUE官方两个例子&#xff0c;基本父子件…

调试CAN过滤器功能使用笔记

一.关于CAN过滤器的配置及使用 提示&#xff1a;此处使用的是雅特力的芯片&#xff08;基本兼容stm32的芯片&#xff09; 这里只讲32位宽的过滤器&#xff0c;16位的用法基本相同&#xff0c;注意因为位数减少数据不一样。 1.1首先过滤器有两种工作模式&#xff1a; 1.标识符…

Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类

目录 73. 矩阵置零 Set Matrix Zeroes &#x1f31f;&#x1f31f; 74. 搜索二维矩阵 Search A 2d-Matrix &#x1f31f;&#x1f31f; 75. 颜色分类 Sort Colors &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang…

逻辑回归与决策树回归

逻辑回归 逻辑回归函数: 逻辑回归分析属于概率型回归分析方法。 假设在自变量xi1、xi2…xip的作用下&#xff0c;因变量y取值为1和0的二值变量&#xff0c;其取值为1的概率为pi&#xff0c;则可以表示为&#xff1a; 相反&#xff0c;y取值为0的概率即&#xff1a; 对y取值为…

FlinkSql 使用总结

一、FlinkSQL底层实现理解 FlinkSQL在flink Framework的位置 Flink Table & SQL API是在DataStream和DataSet之上封装的一层高级API。由于DataStream和DataSet有各自的API&#xff0c;开发起来又有些困难&#xff0c;如果只是应对一些相对通用的需求会有点麻烦。而Flink T…

【AUTOSAR】UDS协议的代码分析与解读(一)----测试UDS协议DID的填写与读取

测试环境配置 Environment-1: Trace32配置&#xff08;内核选择&#xff09; Environment-2: Dgs上位机配置&#xff08;报文发送&#xff09; AV012 Dgs密码 &#xff1a;hsae_dgs 配置请求ID和响应ID可以去代码中查看&#xff0c;备注型号和设备类别&#xff0c;选择售后烧…

一款集成了多种老牌工具字典的轻量级目录扫描器

功能 dirxk&#xff0c;一款集成了多种老牌工具字典的轻量级目录扫描器&#xff0c;包括御剑后台扫描字典&#xff0c;test404网站备份&#xff0c;web破壳扫描器&#xff0c;御剑1.5扫描字典&#xff0c;御剑专业版字典&#xff0c;wwwscan字典&#xff0c;dirscan字典&#…

ceph块存储使用总结

ceph块存储使用总结 大纲 ceph osd pool池创建 & 更新osd pool关联应用删除ceph osd pool使用ceph块存储自动挂载扩容 本次测试相关环境与软件&#xff1a; ceph15.2.17 Octopuseph-deploy 2.0.1ubuntu18.04.6 ceph osd pool池 基础概念 Ceph 将数据存储在存储池中。…

Hive存储格式

hive的存储格式 hive的存储格式分为两大类&#xff1a;一类纯文本文件&#xff0c;一类是二进制文件存储。 第一类&#xff1a; 纯文本文件存储 textfile: 纯文本文件存储格式&#xff0c;不压缩&#xff0c;也是hive的默认存储格式&#xff0c;磁盘开销大&#xff0c;数据解…