SpringBoot2.7.14整合Swagger3.0的详细步骤及容易踩坑的地方

news2024/11/27 12:55:19

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:SpringBoot实战


系列文章目录

以下是专栏部分内容,更多内容请前往专栏查看!

标题
一文带你学会使用SpringBoot+Avue实现短信通知功能(含重要文件代码)
一张思维导图带你学会Springboot创建全局异常、自定义异常
一张思维导图带你打通SpringBoot自定义拦截器的思路
28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
一张思维导图带你学会SpringBoot、Vue前后端分离项目线上部署
一张流程图带你学会SpringBoot结合JWT实现登录功能
一张思维导图带你学会使用SpringBoot中的Schedule定时发送邮件
一张思维导图带你学会使用SpringBoot异步任务实现下单校验库存
一张思维导图带你学会SpringBoot使用AOP实现日志管理功能

在这里插入图片描述


专栏推荐

  • 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。链接>>>>>>>>>《Redis从头学》
  • 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。链接>>>>>>>《图解RabbitMQ》

文章目录

  • 系列文章目录
  • 专栏推荐
  • 🌟引入依赖
  • 🌟applicationproperties配置文件
  • 🌟配置类创建
  • 🌟常用注解
  • 🌟具体用法
    • @ApiModel+@ApiModelProperty
    • @Api+@ApiOperation+@ApiParam
    • @ApiResponses+@ApiResponse
    • 效果查看
  • 🌟写在最后

🌟引入依赖

<!--swagger ui接口文档依赖-->
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-boot-starter</artifactId>
       </dependency>

🌟applicationproperties配置文件

Springfox MVC路径匹配是基于AntPathMatcher的,而Spring Boot 2.7.14基于PathPatternMatcher。可以查看WebMvcProperties类

在这里插入图片描述因此,修改mvc的匹配策略为ant_path_matcher。如果swagger与springboot匹配策略不一致则会有错误:

Failed to start bean ‘ documentationPluginsBootstrapper ‘ ; nested exception…

spring.mvc.pathmatch.matching-strategy=ant_path_matcher

🌟配置类创建

@Component
@Data
@EnableOpenApi
public class SwaggerConfiguration {
    /**
     * 用户端接口文档
     * @return
     */
    @Bean
    public Docket webApiDoc(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("用户端接口文档")
                .pathMapping("/")
                //定义是否开启swagger
                .enable(true)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("top.daencode"))
                //正则匹配请求路径,并分配至当前分组
                .paths(PathSelectors.ant("/api/**"))
                .build()
        //新版swagger3.0配置
                .globalRequestParameters(getGlobalRequestParameters())
                .globalResponses(HttpMethod.GET, getGlobalResponseMessage())
                .globalResponses(HttpMethod.POST, getGlobalResponseMessage());
    }
    /**
     * 管理端接口文档
     * @return
     */
    @Bean
    public Docket adminApiDoc(){
        return new Docket(DocumentationType.OAS_30)
                .groupName("管理端接口文档")
                .pathMapping("/")
                //定义是否开启swagger
                .enable(true)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("top.daencode"))
                //正则匹配请求路径,并分配至当前分组
                .paths(PathSelectors.ant("/api/**"))
                .build()
                .globalRequestParameters();
    }
    /**
     * 接口文档元数据信息
     * @return
     */
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("xxx项目接口文档")
                .description("接口文档")
                .contact(new Contact("daencode","https:daencode.top","shoanjen@126.com"))
                .version("v1.0")
                .build();
    }
    /**
     * 生成全局通用请求参数
     * @return
     */
    private List<RequestParameter> getGlobalRequestParameters() {
        List<RequestParameter> parameters = new ArrayList<>();
        parameters.add(new RequestParameterBuilder()
                .name("token")
                .description("登录令牌")
                .in(ParameterType.HEADER)
                .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
                .required(false)
                .build());
//        可以配置多个
//        parameters.add(new RequestParameterBuilder()
//                .name("version")
//                .description("版本号")
//                .required(true)
//                .in(ParameterType.HEADER)
//                .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
//                .required(false)
//                .build());
        return parameters;
    }
    /**
     * 生成通用的接口文档响应信息
     * @return
     */
    private List<Response> getGlobalResponseMessage() {
        List<Response> responseList = new ArrayList<>();
        responseList.add(new ResponseBuilder().code("4xx").description("请求错误,根据code和msg检查").build());
        return responseList;
    }
}

注意

  • 使用@EnableOpenApi开启swagger3.0。
  • apis(RequestHandlerSelectors.basePackage(“top.daencode”)):注意修改此处生效的包名。
  • .paths(PathSelectors.ant(“/api/**”)):修改接口的通用路径。
  • parameters.add:生成全局通用配置参数,比如说用户登录的token。

🌟常用注解

注解描述
@Api用于描述整个API接口的信息,包括API的标题、描述等。
@ApiOperation用于描述单个接口的操作信息,包括接口的HTTP方法、路径、描述等。
@ApiParam用于描述接口参数的信息,包括参数名、类型、描述等。
@ApiModel用于描述接口返回结果或请求体的模型信息。
@ApiModelProperty用于描述模型属性的信息,包括属性名、类型、描述等。
@ApiIgnore用于忽略某个API接口,使其不在生成的文档中显示。
@ApiResponse用于描述接口的响应信息,包括响应码、描述、返回类型等。
@ApiResponses用于描述多个接口响应的信息,可以与@ApiResponse配合使用。

🌟具体用法

@ApiModel+@ApiModelProperty

@ApiModel("用户登录对象")
@Data
public class UserLogin {
    @ApiModelProperty(value = "用户名",example = "daencode")
    private String username;
    @ApiModelProperty(value = "密码",example = "123456")
    private String password;
    @ApiModelProperty(value = "验证码",example = "3425")
    private String captcha;
}

@Api+@ApiOperation+@ApiParam

@Api("用户模块")
@RestController
@RequestMapping("/api/v1/user")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("login")
    @ApiOperation("用户登录")
    public JsonData login(@ApiParam("登录对象") @RequestBody UserLogin userLogin){
        //token为空则返回失败,否则返回成功
        String token=userService.login(userLogin);
        return token==null?JsonData.buildError("登录失败"):JsonData.buildSuccess(token);
    }
}


@ApiResponses+@ApiResponse

@ApiOperation("创建用户")
@ApiResponses(value = {
        @ApiResponse(code = 201, message = "用户创建成功", response = User.class),
        @ApiResponse(code = 400, message = "请求参数有误"),
        @ApiResponse(code = 401, message = "未授权访问"),
        @ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
    // ...
}


效果查看

1.前往postman发起接口请求测试。
在这里插入图片描述
2.访问:http://localhost:8080/swagger-ui/index.html,查看接口文档。
在这里插入图片描述


🌟写在最后

有关于SpringBoot2.7.14整合Swagger3.0的详细步骤及容易踩坑的地方到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

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

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

相关文章

基于C#的AE二次开发之IQueryFilter接口、ISpatialFilter接口、IQueryDef 接口的查询接口的介绍

一、开发环境 开发环境为ArcGIS Engine 10.2与Visual studio2010。在使用ArcEngine查询进行查询的时候主要使用三种查询接口IQueryFilter&#xff08;属性查询&#xff09; 、ISpatialFilter&#xff08;空间查询&#xff09; 、IQueryDef &#xff08;多表查询&#xff09; 那…

js 事件流、事件冒泡、事件捕获、阻止事件的传播

事件流 js 事件的执行过程分为捕获阶段&#xff08;由外层节点传播到内层节点&#xff09;和冒泡阶段&#xff08;由内层节点传播到外层节点&#xff09;&#xff0c;即先执行捕获阶段的代码&#xff0c;后执行冒泡阶段的代码 事件冒泡 js 事件中的代码默认在冒泡阶段执行&…

滚动渐变导航栏

实现导航栏固定顶部&#xff0c;且滚动渐变的效果 实现效果 准备html vscode可利用快捷输入 header>aul>li*3>atab <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"…

ULID 在 Java 中的应用: 使用 `getMonotonicUlid` 生成唯一标识符

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【Java】防沉迷实名认证系统接口测试代码(已全示例通过)

下面的代码以及置顶文件使用并修改了作者:jsppqq.com的开源代码&#xff0c;只作学习使用&#xff0c;侵删 背景&#xff1a; 在接入Taptap的防沉迷实名认证前&#xff0c;需要先通过国家防沉迷实名认证系统的接口测试&#xff0c;要求全部示例通过才能允许使用接口&#xff1…

docker安装nacos和sentinel笔记

docker安装nacos和sentinel笔记 docker安装nacos docker pull nacos/nacos-server:v2.2.3docker run -d --name -p 8848:8848 -e PREFER_HOST_MODEhostname -e MODEstandalone nacos/nacos-server:v2.2.3docker安装sentinel docker pull bladex/sentinel-dashboard:1.8.0doc…

研究报告:周界警戒AI算法+视频智能分析在安全生产场景中的应用

长期以来&#xff0c;周界防范安防系统在大型园区、工厂、社区、机场、火车站站台、重点单位等领域应用较为广泛和常见。随着AI人工智能等新兴技术的快速发展与落地应用&#xff0c;通过AI智能检测与视频智能分析技术&#xff0c;现代化的周界安防系统可以做到全天候快速、准确…

Mysql 数据库基础介绍

Mysql 数据库基础介绍 一、数据库介绍1.1、数据库的发展史1.1.1、文件管理系统的缺点1.1.2、 数据库系统发展阶段 1.3、 DBMS 数据库管理系统1.4、数据库管理系统的优点1.5、数据库管理系统的基本功能1.6、数据库系统的架构1.7、各种数据库管理系统1.7.1、 层次数据库1.7.2、 网…

企业主要人员API的价值:构建数据驱动的投资策略

引言 在当今充满挑战和机遇的金融市场中&#xff0c;投资者不再仅仅依赖传统的财务数据和技术分析来制定投资策略。数据驱动的投资策略已经成为越来越流行和成功的方法之一。本文将深入探讨企业主要人员信息API的价值&#xff0c;以及如何利用这些数据构建数据驱动的投资策略。…

在微信商城中添加分销功能步骤是什么

微信公众号作为一种社交媒体平台&#xff0c;为商家提供了丰富的营销工具和功能。其中&#xff0c;分销功能是一种非常有效的营销手段&#xff0c;可以帮助商家扩大销售渠道&#xff0c;提高销售额和品牌知名度。下面是在微信公众号上实现分销功能的步骤&#xff1a; 一、了解分…

Linux 线程同步、互斥锁、避免死锁、条件变量

1. 线程同步概述 线程同步定义 线程同步&#xff0c;指的是控制多线程间的相对执行顺序&#xff0c;从而在线程间正确、有序地共享数据&#xff0c;以下为线程同步常见使用场合。 多线程执行的任务在顺序上存在依赖关系线程间共享数据只能同时被一个线程使用 线程同步方法 …

阿里云服务器+Frp+Proxifier工具进行内网穿透

阿里云服务器FrpProxifier工具进行内网穿透 为什么进行内网穿透&#xff1f; 什么叫内网穿透&#xff1f; 首先我们对内网和外网这两个名词做个解释&#xff1a; 内网&#xff1a;是内部建立的局域网络或办公网络,例如家庭内部网络&#xff0c;公司内部网络&#xff1b; 外…

如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?

众所周知&#xff0c;规范着装在很多场景中起着重要的作用。违规着装极易增加安全隐患&#xff0c;并且引发安全事故和质量问题&#xff0c;例如&#xff0c;在化工工厂中&#xff0c;倘若员工没有穿戴符合要求的特殊防护服和安全鞋&#xff0c;将有极大可能受到有害物质的侵害…

9.18日学习记录

1.VS2019Qt获取电脑设备名称 &#xff08;1&#xff09;添加网络模块network VS2019 Qt 怎么添加Qt模块&#xff1f;_vs 2019 qt widget应用程序泵设置 qt module_令狐掌门的博客-CSDN博客 &#xff08;2&#xff09;关键代码&#xff1a; #include <QHostInfo> QSt…

中小企业生产信息化系统哪个好用?选亿发制造业管理系统提供商

中小型制造企业虽然规模相对较小&#xff0c;但同样是市场经济的重要组成部分。要在这个竞争环境中脱颖而出&#xff0c;智能化生产管理系统成为中小型制造企业不可或缺的工具。让各部门之间的数据无缝衔接&#xff0c;实现工厂的整体协调性和工作效率的大幅提升。 让我们从几个…

【go语言】条件,选择,循环和特殊语句

if语句 a:10 if a>20{fmt.Printf("a大于20") }else if a<10{fmt.Printf("a小于10") }else{fmt.Printf("a大于等于10&#xff0c;a小于等于20") }go语言的if语句和C语言的if语句的差不多&#xff0c;需要注意的是else 和else if要写在括号…

首批Sui教育资助计划获奖者公布,超过30万美元奖金已发放

我们非常高兴地宣布Sui教育资助计划的第一批获奖者&#xff0c;该资助计划旨在支持那些有兴趣培养下一代创新者的开发者。本轮共有9个团队获得了超过30万美元的资助&#xff0c;所选提案包括开发新手营、课程、游戏化学习任务、开发者教育工具和技术workshops等。 Sui教育资助…

手机弱网测试工具:Charles

我们在测试app的时候&#xff0c;需要测试弱网情况下的一些场景&#xff0c;那么使用Charles如何设置弱网呢&#xff0c;请看以下步骤&#xff1a; 前提条件&#xff1a; 手机和电脑要在同一局域网内 Charles连接手机抓包 一、打开Charles&#xff0c;点击代理&#xff0c;…

Java笔记一

D:\java_dev\Java\jdk-20 创建 E:\javawork Hello World! E:\javawork-----新建HelloWorldApp.java 记事本打开文件 一&#xff1a; 在HelloWorldApp.java输入代码 public class HelloWorldApp{public static void main (String args[]){​ System.out.println(“H…