(文末有彩蛋,不看白不看)兑现一下之前答应读者的事

news2024/11/15 13:35:27

大家过年好呀!(我)明天就要开工上班啦!在假期的最后一天踢了会球,简单吃点东西,晚上来兑现答应一位读者的事情。开整!

前情提要

这篇文章缘起于「开发者」技术交流群中一位读者遇到的问题:

在这里插入图片描述

简单来说,就是 Spring Boot 3 + Swagger3 的组合用之前的方式配置有问题。趁着假期还在,咱们把问题解决了,也算是兑现之前的承诺。

问题重现

我们先来复现一下这位读者描述的问题,首先下载《Spring Boot趣味实战课》Swagger 章节的相关源码:

https://github.com/liushuijinger/spring-boot-book/tree/master/05-rest

然后将 Spring Boot 的版本升级到 3.0+。当然,在此之前,你需要先配置好 JDK 17 及以上的 Java 环境。

以上操作完成后,我们启动项目。这时你会看到类似如下的报错:

java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present
  at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) ~[na:na]
  at java.base/sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:125) ~[na:na]
  at java.base/sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49) ~[na:na]
  ......
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest
  at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na]
  at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
  at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
  at java.base/java.lang.Class.forName0(Native Method) ~[na:na]
  at java.base/java.lang.Class.forName(Class.java:467) ~[na:na]
  at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:114) ~[na:na]
  ... 37 common frames omitted
​
Disconnected from the target VM, address: '127.0.0.1:59039', transport: 'socket'
​
Process finished with exit code 0

解决问题

《Spring Boot趣味实战课》中使用了 knife4j,所以我们直接基于 knife4j 进行配置。还是我们熟悉的步骤,先添加 Maven 依赖:

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>

记得将之前与 Swagger 有关的依赖全部删除。

接下来修改 Swagger 的配置类:

@Configuration
public class SwaggerConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Spring Boot趣味实战")
                        .version("1.0")
                        .description( "Spring Boot趣味实战的 RESTFul 接口文档说明")
                        .termsOfService("https://liushuijinger.blog.csdn.net")
                        .license(new License().name("Apache 2.0")
                                .url("https://liushuijinger.blog.csdn.net")));
    }

}

最后修改一下 Controller:

@RestController
@Tag(name = "Swagger Demo")
@RequestMapping("/rest")
public class RestFulController {
    
    @GetMapping("/swagger")
    @Operation(summary = "Swagger 接口")
    public String swagger() {
        return "Swagger Method";
    }
    
}

其实就是换了两个注解。

改完以后,我们启动项目并访问 http://localhost:8080/doc.html 来看看效果:

在这里插入图片描述

OK,看到这个界面,说明问题已经搞定了。那么这是怎么一回事呢?

收个尾

导致 Spring Boot 3 与之前的配置不兼容的原因很简单——Spring Boot 3 只支持 OpenAPI3 规范,需要引用 springdoc-openapi 相关的 Jar。所以,换掉 Maven 依赖,再简单修改一下,就 OK 了。

想知道具体是哪些依赖,或者想使用原生 Swagger 的可以戳这里:https://springdoc.org/

一些注解的变化:

  • @Api@Tag
  • @ApiIgnore@Parameter(hidden = true) or @Operation(hidden = true) or @Hidden
  • @ApiImplicitParam@Parameter
  • @ApiImplicitParams@Parameters
  • @ApiModel@Schema
  • @ApiModelProperty(hidden = true)@Schema(accessMode = READ_ONLY)
  • @ApiModelProperty@Schema
  • @ApiOperation(value = "foo", notes = "bar")@Operation(summary = "foo", description = "bar")
  • @ApiParam@Parameter
  • @ApiResponse(code = 404, message = "foo")@ApiResponse(responseCode = "404", description = "foo")

彩蛋

彩蛋来啦!视频没有声音,请放心在任意场合观看!

https://mp.weixin.qq.com/s/6MB8LHhkmwX5NCASWX03Uw (视频只能在这里看啦)

哈哈,表演个节目给大家拜个晚年,祝大家晚年幸福哦~。如果觉得我这后空翻还不错,啊呸!觉得文章写得不错,就转评赞随便给一个吧!

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

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

相关文章

《树上的男爵》坚持解释不清的理想是疏离,还是自由?

《树上的男爵》坚持解释不清的理想是疏离&#xff0c;还是自由&#xff1f; 伊塔洛卡尔维诺&#xff0c;意大利作家&#xff0c;后现代主义派。 卡尔维诺为“寓言式奇幻文学的大师”。&#xff08;评论家赫伯特密特甘评&#xff09; 吴正仪 译 许多年来&#xff0c;我为一些连我…

【3】SpringBoot基础

//从事微服务开发工作 SpringBoot提供一种快速使用Spring的方式 1、自动化 2、设置多个starter配置依赖比Maven直接管理更便捷 3、内置服务器 总结&#xff1a;自动配置&#xff0c;起步依赖&#xff0c;辅助功能 2.6.11版本的说明书 Spring Boot Reference Documentation…

第九层(8):STL之set/multiset

文章目录前情回顾set/multiset概念区别构造函数赋值函数大小操作函数交换函数插入函数删除函数查找函数统计函数为什么set不可以插入重复数据pair数组pair数组创建怎么样去改变set容器的排序规则下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一…

智公网:一级消防师要掌握的知识点!

一、建筑物的耐火等级 1、建筑物的耐火等级分为四级&#xff0c;一、二、三、四级。 2、节点缝隙或金属承重构件节点的外露部位&#xff0c;应做防火保护层。 3、民用建筑的耐火等级、层数、长度和面积&#xff0c;一二级最大防火分区的长度250m。多层建筑最大允许建筑面积2…

【gcc/g++/gdb/cmake】命令

文章目录参考资料一、gcc/g/make1 gcc和g的区别2 gcc/g与make区别3 make与cmake区别二、开发环境搭建1 编译器&#xff0c;调试器&#xff0c;CMake安装2 GCC编译器2.1 编译过程2.1.1 -E 预处理-Pre-Processing .i文件2.1.2 -S 编译-Compiling .s文件2.1.3 -C 汇编-Assembling …

软件工程(二)——需求工程、统一建模语言UML

目录 一、需求获取 二、需求分析 1.结构化需求分析 2.面向对象分析方法OOA 三、UML 41视图 四、UML 图 (1)用例图 (2)类图、对象图 (3)顺序图 &#xff08;4&#xff09;活动图 &#xff08;5&#xff09;状态图 &#xff08;6&#xff09;通信图 软件需求指用户对系…

【科研】ET-BERT代码分析

0. 数据集 论文使用的TLS1.3数据集是从 2021 年 3 月到 2021 年 7 月在中国科技网 (CSTNET) 上收集的。 如果要使用自己的数据集的话&#xff0c;需要检查数据格式是否与datasets/cstnet-tls1.3/目录下一致&#xff0c;并且在data_process/目录下指定数据集路径。 用于微调的…

Pomotroid 使用指南:一款高颜值 PC 端番茄时钟

文章首发于个人公众号&#xff1a;「阿拉平平」 番茄工作法作为一套高效易行的时间管理方案&#xff0c;是由意大利人弗朗西斯科西里洛于 1992 年创立的。作者发明的初衷源自于自身严重的拖延症&#xff0c;于是他找来一个厨房用的番茄计时器&#xff0c;调到 10 分钟&#xff…

游戏SDK(二)框架设计

前言 根据上一篇游戏SDK&#xff08;一&#xff09; 客户端整体架构&#xff0c;介绍了游戏SDK 及 游戏SDK的需求分析。根据需求分析&#xff0c;对游戏SDK的设计分为3大块&#xff1a; 客户端&#xff1a;接口统一&#xff0c;做好逻辑转发和处理。具体渠道具体实现&#xf…

【高并发】- 生产级系统搭建 - 4

前言 关于高并发系统中&#xff0c;当前比较热门的还是属于“秒杀”系统&#xff0c;前面章节在整理了“秒杀”系统的相关设计概念后&#xff0c;本章节&#xff0c;来讲解扣减库存相关的业务逻辑。 1 库存的那些事 一般电商网站中&#xff0c;购买流程一般都是这样的&#xff…

多线程之Callable接口、ReentrantLock、信号量 Semaphore以及CountDownLatch

目录&#xff1a;一、Callable接口Callable的用法小结二、ReentrantLockReentrantLock 的用法ReentrantLock 和 synchronized 的区别&#xff1f;为什么有了 synchronized 还需要 juc(java.util.concurrent) 下的 lock&#xff1f;三、信号量 Semaphore如何理解信号量&#xff…

Python接口测试实战4(下) - 框架完善:用例基类,用例标签,重新运行上次失败用例

本节内容使用用例基类自定义TestSuitecollect-only的实现testlist的实现用例tags的实现rerun-fails的实现命令行参数的使用更简单的用例编写使用用例基类因为每条用例都需要从excel中读取数据&#xff0c;解析数据&#xff0c;发送请求&#xff0c;断言响应结果&#xff0c;我们…

阿里云ECS学习笔记1

ECS&#xff1a;弹性计算服务。CPU可以热插、内存可变大变小、硬盘可以增加~ 注册&#xff1a; 在企业中&#xff0c;应该以企业的身份进行注册&#xff0c;而不是以个人身份进行注册。 手机号&#xff1a;行政部门专门管理注册的账号资源的&#xff0c;而不使用个人或者老板…

【可解释性机器学习】解释基于XGBoost对泰坦尼克号数据集的预测过程和结果

解释基于XGBoost对泰坦尼克号数据集的预测过程和结果1. 训练数据2. 简单的 XGBoost 分类器3. 解释重量4. 解释预测5. 添加文本特性参考资料本文介绍如何分析XGBoost分类器的预测&#xff08; eli5也支持 XGBoost和大多数 scikit-learn树集成的回归&#xff09;。 我们将使用 Ti…

【数据结构】8.5 归并排序

文章目录相邻两个有序子序列的归并归并排序算法归并排序算法分析基本思想 将两个或两个以上的有序子序列归并为一个有序序列。在内部排序中&#xff0c;通常采用的是2-路归并排序。 即&#xff1a;将两个位置相邻的有序子序列 R[l…m] 和 R[m1…n] 归并为一个有序序列 R[l…n]…

1个寒假能学会多少网络安全技能?

现在可以看到很多标题都声称三个月内就可以转行网络安全领域&#xff0c;并且成为月入15K的网络工程师。那么&#xff0c;这个寒假的时间能学多少网络安全知识&#xff1f;是否能入门网络安全工程师呢&#xff1f; 答案是肯定的。 虽然网络完全知识是一门广泛的学科&#xff…

在线支付系列【9】微信支付之申请微信公众号

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言申请微信公众号前言 由于微信支付的产品体系全部搭载于微信的社交体系之上&#xff0c;所以直连商户或服务商接入微信支付之前&#xff0c;都需要有一个微信社交载体&#xff0c;该载体对应…

天啦撸~ChatGPT通过国际软件测试工程师(ISTQB)认证了~

天啦撸&#xff01;目前最火的AI应用ChatGPT通过ISTQB认证了~ 近期&#xff0c;国外的一位工程师&#xff0c;放出了他用ChatGPT通过认证的相关信息。 ChatGPT相信大家都知道是什么了&#xff0c;ISTQB相信很多测试小伙伴也不陌生&#xff0c;而且很多考证的小伙伴也对此梦寐以…

Linux之网络性能测试工具netperf实践

一、netperf简介 Netperf是一种网络性能的测量工具&#xff0c;主要针对基于TCP或UDP的传输。Netperf根据应用的不同&#xff0c;可以进行不同模式的网络性能测试&#xff0c;即批量数据传输&#xff08;bulk data transfer&#xff09;模式和请求/应答&#xff08;request/rep…

公司通知要大裁员,hr太强势,和所有人吵起来,老板见势不妙,不得不答应大家要求,把HR一起裁掉了!...

在裁员中&#xff0c;hr一般都会代表老板的利益和员工对抗&#xff0c;但如果hr和员工闹翻了&#xff0c;老板会维护hr吗&#xff1f;一位网友说&#xff1a;一上班就收到消息要裁员&#xff0c;立马让报上名单面谈&#xff0c;锁电脑关权限。后面那些人面谈的时候吵起来了&…