智能提醒助理系列-jdk8升级到21,springboot2.3升级到3.3

        本系列文章记录“智能提醒助理”产品建设历程,记录实践经验、巩固知识点、锻炼总结能力。

本篇介绍技术栈升级的过程,遇到的问题和解决方案。

一、需求出发点

智能提醒小程序 当前使用的是jdk8,springboot2.3,升级到jdk21和springboot3.3 学习新知识的同时,感受带来的性能提升。

二、实现路径

先了解其他人的升级经验,获取maven 依赖的版本号。

然后就是 报错替换,最最主要的还是servlet包 变动大。

<properties><jdy.version>4.0</jdy.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>21</java.version><mybatis-plus.version>3.5.7</mybatis-plus.version><dynamic-datasource.version>4.3.1</dynamic-datasource.version><pagehelper.boot.version>1.4.7</pagehelper.boot.version><druid.version>1.2.23</druid.version><bitwalker.version>1.19</bitwalker.version><kaptcha.version>2.3.2</kaptcha.version><oshi.version>3.9.1</oshi.version><commons.io.version>2.15.1</commons.io.version><commons.fileupload.version>1.3.3</commons.fileupload.version><commons.beanutils.version>1.9.3</commons.beanutils.version><jsoup.version>1.18.1</jsoup.version><poi.version>3.17</poi.version><velocity.version>1.7</velocity.version><lombok.version>1.18.34</lombok.version><fastjson.version>1.2.83</fastjson.version></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.4</version></parent>

三、实际操作遇到的问题

1、shiro无springboot3.3版本的支持

先参考以上3篇完成后,基本就能跑起来了。

跑起来 遇到的第一个问题就shiro 与springboot3.3.4 不兼容的问题。

调整了多次无果,最后决定把shiro框架卸载掉,重写了shiro部分,过程比预计的难度要低。

2、swagger API 调整较大

API差别较大,修改工作量大,且当前开发人员少,用不上。考虑先卸载掉,后续需要的时候再加上。

3、springboot3.3.4版本 404 请求报错

升级前:

当前访问一个不存在的资源时会返回404,不会抛出异常。

升级后:

会抛出异常:

 [XNIO-1 task-7] ERROR [18d92340fb214056b1e2691fb04aeb36] [c.j.c.c.c.e.GlobalExceptionHandler.handleException-55] - No static resource version.
org.springframework.web.servlet.resource.NoResourceFoundException: No static resource version.at org.springframework.web.servlet.resource.ResourceHttpRequestHandler.handleRequest(ResourceHttpRequestHandler.java:585)at org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.handle(HttpRequestHandlerAdapter.java:52)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:527)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:67)at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:276)at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:132)at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:256)at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:101)at io.undertow.server.Connectors.executeRootHandler(Connectors.java:395)at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:859)at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2513)at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1538)at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)at java.base/java.lang.Thread.run(Thread.java:1583)

解决办法:

增加全局异常处理,顺便把其他分类的异常也统一处理下

package com.jdy.common.core.controller.exception;import com.jdy.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.resource.NoResourceFoundException;/*** 全局异常处理器** @author ruoyi*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {/** 404全局异常处理 */@ExceptionHandler(NoResourceFoundException.class)public R handleException(NoResourceFoundException e) {log.error("请求资源不存在:{}",e.getMessage());return R.failure("404", "请求资源不存在", "");}/** 400 无效请求,参数错误 */@ExceptionHandler(IllegalArgumentException.class)public R handleException(IllegalArgumentException e) {log.error("无效请求,参数错误:{}",e.getMessage());return R.failure("400", "无效请求,参数错误", "");}/** 405请求方式不支持 */@ExceptionHandler({HttpRequestMethodNotSupportedException.class})public R handleException(HttpRequestMethodNotSupportedException e) {log.error("请求方式不正确:{}",e.getMessage(), e);return R.failure("405", "请求资源不支持" + e.getMethod() + "请求", "");}/** 500全局异常处理 */@ExceptionHandler(Exception.class)public R handleException(Exception e) {log.error("全局异常:{}",e.getMessage(), e);return R.failure("500", "服务器忙", "");}}

 结果展示:

4、pagehelper 分页插件失效

升级前<!-- pagehelper 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.1</version></dependency>升级后<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version><exclusions><exclusion><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.5</version></dependency>需要注意:
第一个参数 要从1开始 而不是0
startPage(page==0 ? 1 : page, size, "id", "DESC");

5、单元测试框架从Junit4升级到了Junit5

org.junit.Test; 升级到了 org.junit.jupiter.api.Test;

升级前:

@RunWith(SpringRunner.class)
@SpringBootTest

升级后:

@RunWith 不再支持。

仅使用 @SpringBootTest 即可

6、容器部署 镜像升级

升级前 11对jdk8是兼容的:
FROM amd64/openjdk:11升级后:
FROM amd64/openjdk:21-rc-jdk

四、总结

升级后要进行全方面的测试,测试后 还可以通过新老版本并行的方式,观察运行情况,及时调整。

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

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

相关文章

MMdetection3D环境配置

为啥要写这个&#xff1f;&#xff1a;没看网上有这个全的环境配置教程T^T 首先说明一下&#xff0c;由于mmdetection3d官方文档说支持Linux平台&#xff0c;实验性支持windows&#xff0c;所以我们选择Linux平台进行开发 0.Linux双系统安装 参考这个视频即可 Windows 和 U…

openapi回调地址请求不通过

目录 1. 验证url接口get请求本地自测报错 2. 测试回调模式成功不返回结果 3. 测试回调模式返回结果带双引号 对接企业微信 产生会话回调事件 接口问题解决 1. 验证url接口get请求本地自测报错 java.lang.IllegalArgumentException: Last encoded character (before the pa…

Chrome和夸克谁更护眼

在当今数字化时代&#xff0c;我们每天长时间面对电脑和手机屏幕&#xff0c;眼睛的健康问题变得越来越重要。浏览器作为我们日常使用频率极高的工具&#xff0c;其护眼功能的优劣直接影响到我们的视觉舒适度。本文将对Chrome和夸克两款主流浏览器进行对比&#xff0c;探讨它们…

命令行参数、环境变量、地址空间

命令行参数&#xff1a; int main(int argc, char *argv[ ])&#xff0c;main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。 在linux中会把输入的字符串存到char *argv[ ]中&#xff0c;在数组的结尾为NULL。 命令行参数可以让同一个程序可以通过不同…

基于Matlab 模拟停车位管理系统【源码 GUI】

系统对进入停车位的车辆进行车牌识别&#xff0c;将识别出来的车牌号显示出来&#xff1b;然后对车主进行人脸识别&#xff0c;框出车主照片的人脸部分作为车主信息的标记&#xff0c;记录在系统库中。车辆在库期间&#xff0c;系统使用者可以随意查看车辆与车主信息的获取过程…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

学习笔记:微服务技术栈(一)服务治理框架SpringCloud

教学视频链接&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 目录 前言一、认识微服务1.1 服务架构1.2 微服务架构1.3 SpringCloud 二、服务拆分及远程调用2.1 服务拆分细节2.2 服务间调用 …

前端小练习——星辰宇宙(JS没有上限!!!)

前言&#xff1a;在刚开始学习前端的时候&#xff0c;我们会学习到前端三件套中的JavaScript&#xff0c;可能那时候读者没有觉得JavaScript这个语言有多么的牛逼&#xff0c;本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…

vrrp和mstp,vrrp和byd

vrrp和mstp 思路 vrrp是用来虚拟网关&#xff0c;噢&#xff0c;是虚拟一条虚拟网关 优先级&#xff0c;priority越大越优先&#xff0c;优先级相同&#xff0c;哪个的路由器的vrrp先起来&#xff0c;谁就是主 mstp是快速生成树协议&#xff0c;防止环路用的 优先级越小越优…

图说复变函数论重大错误:将无穷多各异平面误为同一面

黄小宁 医学若将前所未知的“新冠”病毒误为已熟知的流感病毒&#xff0c;后果...&#xff1b;数学将前所未知的点集误为已熟知的集就会引出一连串的重大错误。 h定理&#xff1a;点集AB的必要条件是A≌B。 证&#xff1a;&#xff08;1&#xff09;任何图≌自己是几何学最起码…

SpringBoot技术:打造新闻稿件管理平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

深入理解DMA(直接存储器访问)

直接存储器访问(DMA,Direct Memory Access)是一种允许外设和内存之间直接传输数据的机制,旨在提高数据传输的效率,减少CPU的负担。在传统的数据传输中,CPU负责所有的数据移动和处理,这导致CPU资源被大量占用,影响系统的整体性能。而DMA的出现,正是为了优化这一过程,使…

【Wi-Fi】WiFi中QAM及16-QAM、64-QAM、512-QAM、1024-QAM、2048-QAM、4096-QAM整理

参考链接 什么是QAM&#xff1f;QAM是如何工作的&#xff1f; - 华为 不同阶QAM调制星座图中&#xff0c;符号能量的归一化计算原理 - 知乎 16 QAM modulation vs 64 QAM modulation vs 256 QAM modulation 512 QAM vs 1024 QAM vs 2048 QAM vs 4096 QAM modulation type…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、GB35114、RTSP/Onvif…

42python数据分析numpy基础之trace计算对角线元素的和

python的numpy库的trace()函数&#xff0c;计算对角线元素的和。 用法 numpy.trace(a, offset0, axis10, axis21, dtypeNone, outNone)描述 numpy.trace(a)&#xff0c;返回数组a的对角线元素的和。 入参 a&#xff1a;必选&#xff0c;数组&#xff0c;列表&#xff0c;元…

WPF+MVVM案例实战(二十三)- 阴影效果详解

文章目录 1、案例效果2、阴影属性参数说明3、阴影效果实现1、案例效果 2、阴影属性参数说明 WPF 中,控件的阴影效果是通过附加属性 Effect 来实现的。这里详细说明以下阴影效果的各个参数。 属性描述BlurRadius阴影模糊程度,值越大越模糊Color阴影颜色Opacity阴影透明度,默…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时&#xff0c;有很多不同的选择。 本文将了解四种流行的解决方案&#xff1a;HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进&#xff1a;变得更快、更方便、更可靠&…