【Springboot系列】Springboot整合Swagger3不简单

news2024/11/14 19:49:54

1、缘由

   Swagger是一个根据代码注解生成接口文档的工具,减少和前端之间的沟通,前端同学看着文档就可以开发了,提升了效率,之前很少写swagger,这次自己动手写,还是有点麻烦,不怎么懂,记录下,避免下次继续踩坑

2、入门

2.1、加入依赖

        新建一个springboo项目,一路next就好,这里使用的maven

pom.xml中加入配置

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

注:第一次用,直接选用新版的,不知道好在哪

2.2、配置类

package com.example.webdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

import java.util.Collections;

@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {

    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(apiInfo())
                // 是否开启swagger
                .enable(true)
                .select()
                // 过滤条件,扫描指定路径下的文件
                .apis(RequestHandlerSelectors.basePackage("com.example.webdemo.controller"))
                // 指定路径处理,PathSelectors.any()代表不过滤任何路径
                //.paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        /*作者信息*/
        Contact contact = new Contact("香菜", "https://blog.csdn.net/perfect2011", "abc@qq.com");
        return new ApiInfo(
                "Spring Boot 集成 Swagger3 测试",
                "Spring Boot 集成 Swagger3 测试接口文档",
                "v1.0",
                "https://blog.csdn.net/perfect2011",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                Collections.emptyList()
        );
    }
}

2.3、查看接口

地址:http://localhost:16002/swagger-ui/index.html

注:这里的端口换成你本地的

看下界面

 

恭喜你成功了,这样就 算是集成了swagger,如果不嫌弃界面难看,可以直接用这个了。

3、Swagger的一些注解

注解概览

注解

描述

@Api

标记一个类为 Swagger 资源。

@ApiImplicitParam

表示 API Operation 中的单个参数。

@ApiImplicitParams

包装注解,包含多个 @ApiImplicitParam 注解

@ApiModel

提供 Swagger models 的附加信息

@ApiModelProperty

添加和操作 model 属性的数据。

@ApiOperation

描述一个特定路径的 operation(通常是 HTTP 方法)

@ApiParam

为 operation 参数添加额外的 meta-data。

@ApiResponse

描述 operation 可能的响应。

@ApiResponses

包装注解,包含多个 @ApiResponse 注解。

@ResponseHeader

表示响应头。

4、实战

swagger自带的UI有点不太舒服,还有一些其他的UI

swagger-bootstrap-ui 和 文档增强工具knife4j

至于其中的区别,暂时也不懂,反正觉得现在的不好看,但是不影响开发

上面的都是入门,是基础的,下面才是在项目中的使用,

在项目中使用的knife4j的增强版,主要是有两个原因,一个是这个提供了搜索功能,另外一个原因就是界面还算好看

4.1 依赖配置

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.8</version>
        </dependency>
        <!-- 引入swagger-ui-layer包 /docs.html-->
        <dependency>
            <groupId>com.github.caspar-chen</groupId>
            <artifactId>swagger-ui-layer</artifactId>
            <version>1.1.3</version>
        </dependency>

4.2 配置类


import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import org.springframework.beans.factory.annotation.Autowired;
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.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;


@Configuration
@EnableSwagger2WebMvc
public class SwaggerConfig {

    /*引入Knife4j提供的扩展类*/
    private final OpenApiExtensionResolver openApiExtensionResolver;

    @Autowired
    public SwaggerConfig(OpenApiExtensionResolver openApiExtensionResolver) {
        this.openApiExtensionResolver = openApiExtensionResolver;
    }

    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        String groupName = "1.0";
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.demo.ccpparking.controller"))
                .paths(PathSelectors.any())
                .build().apiInfo(new ApiInfoBuilder()
                        .title("停车场服务接口")
                        .description("停车场服务接口")
                        .version("1.0")
                        .termsOfServiceUrl("")
                        .build())
                //赋予插件体系
                .extensions(openApiExtensionResolver.buildExtensions(groupName));
    }


}

4.3 application.yml 配置

直接是根配置下

knife4j:
  enable: true
  setting:
    language: zh-CN
    enableSwaggerModels: false
    enableDocumentManage: false
    enableHomeCustom: false
    enableFooter: false
    enableOpenApi: false
    enableAfterScript: false

4.4 配置接口

这里直接选择一个作为实例

@RestController
@Api(tags = "第三方接口")
public class ExposeController {
    @Resource
    ParkingService parkingService;
    @ApiOperation(value = "查询最近的停车场", notes = "参数是经纬度", httpMethod = "GET", tags = {"第三方接口"})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "角色id", dataType = "String", paramType = "header"),
            @ApiImplicitParam(name = "longitude", value = "经度", dataType = "double", paramType = "path"),
            @ApiImplicitParam(name = "latitude", value = "纬度", dataType = "String", paramType = "path")
    })
    @GetMapping("/closestpark")
    public ResponseEntity<ParkingInfoEntity> getClosestPark(@RequestParam(value = "longitude") Double longitude, @RequestParam(value = "latitude") Double latitude) {
        ParkingInfoEntity closestPark = parkingService.getClosestPark(longitude, latitude);
        return ResponseEntity.ok(closestPark);
    }
}

返回值使用ApiModel注解

@Data
@ApiModel(description = "停车场基础信息")
public class ParkingInfoEntity implements Serializable {

    @ApiModelProperty(value = "停车场Id")
    private String parkingId;

    @ApiModelProperty(value = "停车场名字")
    private String parkingName;

}

4.5 看下结果

 4.6 总结

例子中简单的使用了swagger,学会了几个知识点

  • @ApiModel 标注对象,会把整个对象做解析
  • @ApiModelProperty 标注字段,会显示字段的意义
  • @Api(tags = "第三方接口") 标注接口的组,可以将接口进行归类,不局限于类
  • @ApiOperation 标注接口,相当于接口的注释
  • @ApiImplicitParams 对参数进行注释
  • @ApiImplicitParam 对单个字段进行注释,这里有两个重要的配置 dataType 是字段的类型,paramType是字段传入的方式,

    常用的有三个

    header–>请求参数的获取:@RequestHeader(代码中接收注解)
    query–>请求参数的获取:@RequestParam(代码中接收注解)
    path(用于restful接口)–>请求参数的获取:@PathVariable(代码中接收注解)

5、总结

整个文章主要写了个入门,这样可以快速的理解怎么使用swagger

然后记录了下自己在项目中如何使用swagger的,可以借鉴然后在项目中使用,也是作为后面再使用的一些资料,好记性不如烂笔头。

最后:

求点赞支持

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

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

相关文章

外网SSH远程连接linux服务器「cpolar内网穿透」

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

OpenGL入门教程之 纹理

引言 我们已经了解到&#xff0c;我们可以为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。但是&#xff0c;如果想让图形看起来更真实&#xff0c;我们就必须有足够多的顶点&#xff0c;从而指定足够多的颜色。这将会产生很多额外开销&#xff0c;因为每…

【ArcGIS Pro二次开发】(23):用地编码和用地名称的规范性检查

在国空或村庄规划的编制过程中&#xff0c;随着规划用地的调整&#xff0c;经常会手动修改用地编码和用地名称&#xff0c;不可避免的会出现错误&#xff0c;如果单靠人工校对&#xff0c;累人又不能保证准确性。这个工具的目的就是检查用地编码和用地名称是否规范&#xff0c;…

最短路径Floyd与区间DP

floyd算法是求最短路径的算法&#xff0c;算法复杂度为n(o^3),其优点在于能够一次求解所有点到其他点的最短路径&#xff0c;不需要其他运算&#xff0c;使用二维数组存储。其三层循环自外向内分别为&#xff1a;中间点&#xff0c;起始点和终点。状态方程为&#xff1a; num[…

【社区图书馆】《网络工程师的Python之路:网络运维自动化实战(第2版)》

文章目录 图书前言图书简介图书作者、简介图书好评图书目录总结&#xff1a;本人选择此图书的意义 图书前言 光阴似箭&#xff0c;岁月如梭。转眼之间&#xff0c;距离本书最早的电子书出版已经过去了三年之久。承蒙广大读者的厚爱&#xff0c;电子书和第1版纸质书的发行量远远…

【云原生】Java 应用程序在 Kubernetes 上棘手的内存管理

文章目录 引言JVM 内存模型简介非 Heap 内存Heap 堆内存Kubernetes 内存管理JVM 和 Kubernetes场景 1 — Java Out Of Memory 错误场景 2 — Pod 超出内存 limit 限制场景 3 — Pod 超出节点的可用内存场景 4 — 参数配置良好&#xff0c;应用程序运行良好 结语 引言 如何结合…

PCIe-DMA多通道/高性能/超低延时/超低抖动视频采集显示V4L2驱动

1 介绍 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe QDMA Subsystem实现了使用DMA地址队列的独立多通道、高性能Continous或Scather GatherDMA&#xff0c;提供fifo/AXI4-Stream用户接口。 基于PCI ExpressIntegrated Block&#xff0c;Multi-Channel PCIe…

大型体检管理系统源码:适用于大中型医院或独立体检中心

一套专业的体检管理系统源码&#xff0c;是医院、体检中心等单位开展体检业务的得力助手。它将以往人工操作的健康体检过程所得到信息转换成全信息化的电脑管理&#xff0c;使体检过程更为流畅、更有条理&#xff0c;更加便于管理&#xff0c;从而实现体检业务管理的自动化、信…

2023年报考CSM敏捷教练认证好不好?含金量高吗?

CSM&#xff0c;Certified Scrum Master&#xff0c;是Scrum联盟发起的Scrum认证。帮助个人从自身、团队和组织层面&#xff0c;学习技能和工具来扩展实践的层面&#xff0c;帮助团队正确使用Scrum&#xff0c;从而提高项目整体成功的可能性。 认证收益 职业能力提升 推动企业…

AIGC技术周报|为文生图模型提供“参考”;交互式prompt系统:让文生图模型更懂你

AIGC通过借鉴现有的、人类创造的内容来快速完成内容创作。ChatGPT、Bard等AI聊天机器人以及DallE 2、Stable Diffusion等文生图模型都属于AIGC的典型案例。「AIGC技术周报」将为你带来最新的paper、博客等前瞻性研究。 交互式prompt系统&#xff1a;让文生图模型更懂你 文生图…

JVM性能监测工具-JConsole

JVM性能监测工具-JConsole JConsole工具是JDK自带的图形化性能监控工具。并通过JConsole工具&#xff0c; 可以查看Java应用程序的运行概况&#xff0c; 监控堆信息、 元空间使用情况及类的加载情况等。 JConsole程序在%JAVA_HOM E%/bin目录下 或者你可以直接在命令行对他进…

【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代

目录 1、准备条件2、实现方式3、代码环境和maven依赖4、Java代码5、示例1结果6、示例2结果7、一个小问题8、“音乐标签”下载地址 1、准备条件 网易云下载的MP3、flac后缀的歌曲若干首&#xff08;ncm后缀的歌曲需要还原格式&#xff0c;不然会随着VIP过期而无法听&#xff09…

《CTFshow-Web入门》06. Web 51~60

Web 51~60 web51题解 web52知识点题解 web53知识点题解 web54知识点题解 web55知识点题解 web56知识点题解 web57知识点题解 web58知识点题解 web59题解 web60题解 ctf - web入门 web51 题解 相比上一题多过滤了 tac 命令。那换一个即可。 题解&#xff1a; url ?cnl<f…

go/java/C++覆盖率工具原理汇总学习记录

go–goc goc采用的是插桩源码的形式&#xff0c;而不是待二进制执行时再去设置breakpoints。这就导致了当前go的测试覆盖率收集技术&#xff0c;一定是侵入式的&#xff0c;会修改目标程序源码。直接看案例 package mainimport "fmt"func main() {test2(3)fmt.Prin…

Vue项目基于driverjs实现新用户导航

引导页就是当用户第一次或者手动进行触发的时候&#xff0c;提示给用户当前系统的模块介绍&#xff0c;比如哪里是退出&#xff0c;哪里是菜单等等相应的操作。 无论是开发 APP 还是 web 应用&#xff0c;新手引导都是一个很常见的需求&#xff0c;一般在这2个方面需要新手引导…

Java阶段二Day07

Java阶段二Day07 文章目录 Java阶段二Day07V17UserControllerDispatcherServletControllerRequestMapping V18DispatcherServletHandleMapping V19BirdBootApplication 线程池线程的执行过程线程池API 数据库数据库的基本概念数据库管理系统中常见的概念 SQL分类DDL语言-数据定…

浅析流媒体技术的发展趋势及EasyCVR视频技术的应用

随着科技的不断发展&#xff0c;流媒体已经成为人们日常生活中必不可少的一部分。为了进一步提高流媒体的质量&#xff0c;未来的技术革新方向将集中在以下几个方面&#xff1a; 1&#xff09;提高视频编解码技术的质量和效率 随着高清视频的普及&#xff0c;人们对流媒体的质…

GD32F470 移植STM32F429工程 Keil调试笔记

keil版本&#xff1a;5.25 安装 GigaDevice.GD32F4xx_DFP.3.0.4.pack Keil.STM32F4xx_DFP.2.15.0.pack 一、GD32F470 与 STM32F429 切换编译 1、原项目为STM32F429 工程&#xff0c;切换到GD32F470 只需在 Options for Target"“对话框的Device菜单中选中“GD32F470II”…

Http协议—请求的构造

目录 一、通过 form表单 构造HTTP请求 1、form 发送 Get 请求 &#xff08;1&#xff09;form 的重要参数 &#xff08;2&#xff09;input 的重要参数 2、通过 form 构造 Post 请求 二、通过 ajax 构造 HTTP 请求 1、基于 jQuery 中的 ajax 构造 &#xff08;1&#x…

动态网站开发讲课笔记07:EL和JSTL

文章目录 零、本节学习目标一、EL&#xff08;一&#xff09;EL基本语法1、EL的概念2、EL的语法3、案例演示&#xff08;1&#xff09;用EL读取保存的信息&#xff08;2&#xff09;使用Java代码与EL获取信息的对比 4、EL基本语法的特点 &#xff08;二&#xff09;EL中的标识符…