位置: IT常识 - 正文

Spring Boot3.0升级,踩坑之旅,附解决方案(springboot升级到2.1.6需要注意)

编辑:rootadmin
本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来,附带更新说明: Spring-Boot-3.0-发布说明 Spring-Boot-3.0.0-M5-发布说明 一. 编译报错,import javax.servlet.*; 不存在 这个报错主要是Spring Boot ...

推荐整理分享Spring Boot3.0升级,踩坑之旅,附解决方案(springboot升级到2.1.6需要注意),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:spring boot 升级,springboot1.5升级到2.1.5,spring boot升级spring cloud,spring boot 升级,springboot版本升级,springboot 1.5升级2.0,spring boot 升级,springboot升级到2.0.0,内容如对您有帮助,希望把文章链接给更多的朋友!

本文基于 newbeemall 项目升级Spring Boot3.0踩坑总结而来,附带更新说明:

Spring-Boot-3.0-发布说明

Spring-Boot-3.0.0-M5-发布说明

一. 编译报错,import javax.servlet.*; 不存在

这个报错主要是Spring Boot3.0已经为所有依赖项从 Java EE 迁移到 Jakarta EE API,导致 servlet 包名的修改,Spring团队这样做的原因,主要是避免 Oracle 的版权问题,解决办法很简单,两步走:

1 添加 jakarta.servlet 依赖

<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId></dependency>修改项目内所有代码的导入依赖修改前:import javax.servlet.*修改后:import jakarta.servlet.*二. 附带的众多依赖包升级,导致的部分代码写法过期报警2.1 Thymeleaf升级到3.1.0.M2,日志打印的报警14:40:39.936 [http-nio-84-exec-15] WARN o.t.s.p.StandardIncludeTagProcessor - [doProcess,67] - [THYMELEAF][http-nio-84-exec-15][admin/goods/goods] Deprecated attribute {th:include,data-th-include} found in template admin/goods/goods, line 4, col 15. Please use {th:insert,data-th-insert} instead, this deprecated attribute will be removed in future versions of Thymeleaf.14:40:39.936 [http-nio-84-exec-15] WARN o.t.s.p.AbstractStandardFragmentInsertionTagProcessor - [computeFragment,385] - [THYMELEAF][http-nio-84-exec-15][admin/goods/goods] Deprecated unwrapped fragment expression "admin/header :: header-fragment" found in template admin/goods/goods, line 4, col 15. Please use the complete syntax of fragment expressions instead ("~{admin/header :: header-fragment}"). The old, unwrapped syntax for fragment expressions will be removed in future versions of Thymeleaf.

可以看出作者很贴心,日志里已经给出了升级后的写法,修改如下:

修改前:<th:block th:include="admin/header :: header-fragment"/>修改后:<th:block th:insert="~{admin/header :: header-fragment}"/>2.2 Thymeleaf升级到3.1.0.M2,后端使用 thymeleafViewResolver 手动渲染网页代码报错// 修改前 Spring Boot2.7:WebContext ctx = new (request, response, request.getServletContext(), request.getLocale(), model.asMap());html = thymeleafViewResolver.getTemplateEngine().process("mall/seckill-list", ctx);Spring Boot3.0升级,踩坑之旅,附解决方案(springboot升级到2.1.6需要注意)

上述代码中针对 WebContext 对象的创建报错,这里直接给出新版写法

// 修改后 Spring Boot3.0:JakartaServletWebApplication jakartaServletWebApplication = JakartaServletWebApplication.buildApplication(request.getServletContext());WebContext ctx = new WebContext(jakartaServletWebApplication.buildExchange(request, response), request.getLocale(), model.asMap());html = thymeleafViewResolver.getTemplateEngine().process("mall/seckill-list", ctx);三. 大量第三方库关于 Spring Boot 的 starter 依赖失效,导致项目启动报错

博主升级到3.0后,发现启动时,Druid 数据源开始报错,找不到数据源配置,便怀疑跟 Spring boot 3.0 更新有关

这里直接给出原因:Spring Boot 3.0 中自动配置注册的 spring.factories 写法已废弃,改为了 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 写法,导致大量第三方 starter 依赖失效

在吐槽一下,这么重要的更改在Spring官方的 Spring-Boot-3.0-发布说明 中竟然没有,被放在了 Spring-Boot-3.0.0-M5-发布说明 中

这里给出两个解决方案:

等待第三方库适配 Spring Boot 3.0按照 Spring Boot 3.0要求,在项目resources 下新建 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,手动将第三方库的 spring.factories 加到 imports 中,这样可以手动修复第三方库 spring boot starter 依赖失效问题四. Mybatis Plus 依赖问题

Mybatis plus 最新版本还是3.5.2,其依赖的 mybatis-spring 版本是2.2.2(mybatis-spring 已经发布了3.0.0版本适配 Spring Boot 3.0),这会导致项目中的sql查询直接报错,这里主要是因 Spring Boot 3.0中删除 NestedIOException 这个类,在 Spring boot 2.7中这个类还存在,给出类说明截图

这个类在2.7中已经被标记为废弃,建议替换为 IOException, 而 Mybatis plus 3.5.2中还在使用。这里给出问题截图 MybatisSqlSessionFactoryBean 这个类还在使用 NestedIOException

查看 Mybatis plus 官方issue也已经有人提到了这个问题,官方的说法是 mybatis-plus-spring-boot-starter 还在验证尚未推送maven官方仓库,这里我就不得不动用我的小聪明,给出解决方案:

手动将原有的 MybatisSqlSessionFactoryBean 类代码复制到一个我们自己代码目录下新建的 MybatisSqlSessionFactoryBean 类,去掉 NestedIOException 依赖数据源自动配置代码修改@Slf4j@EnableConfigurationProperties(MybatisPlusProperties.class)@EnableTransactionManagement@EnableAspectJAutoProxy@Configuration@MapperScan(basePackages = "ltd.newbee.mall.core.dao", sqlSessionFactoryRef = "masterSqlSessionFactory")public class HikariCpConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } @Bean(name = "masterDataSource") @ConfigurationProperties(prefix = "spring.datasource.master") public DataSource masterDataSource() { return new HikariDataSource(); } /** * @param datasource 数据源 * @return SqlSessionFactory * @Primary 默认SqlSessionFactory */ @Bean(name = "masterSqlSessionFactory") public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource datasource, Interceptor interceptor, MybatisPlusProperties properties) throws Exception { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(datasource); // 兼容mybatis plus的自动配置写法 bean.setMapperLocations(properties.resolveMapperLocations()); if (properties.getConfigurationProperties() != null) { bean.setConfigurationProperties(properties.getConfigurationProperties()); } if (StringUtils.hasLength(properties.getTypeAliasesPackage())) { bean.setTypeAliasesPackage(properties.getTypeAliasesPackage()); } bean.setPlugins(interceptor); GlobalConfig globalConfig = properties.getGlobalConfig(); bean.setGlobalConfig(globalConfig); log.info("------------------------------------------masterDataSource 配置成功"); return bean.getObject(); } @Bean("masterSessionTemplate") public SqlSessionTemplate masterSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); }}

到这里,项目就能够正常跑起来了

总结

Spring Boot 3.0 升级带来了很多破坏性更改,把众多依赖升级到了最新,算是解决了一部分历史问题,也为了云原型需求,逐步适配 graalvm ,不管怎么样作为技术开发者,希望有更多的开发者来尝试 Spring Boot 3.0 带来的新变化。

本文链接地址:https://www.jiuchutong.com/zhishi/310454.html 转载请保留说明!

上一篇:php中__call方法怎么用(php call方法)

下一篇:phpcms v9安装无法连接数据库怎么办(php安装不了)

  • 腾讯会员可以几台设备登录(腾讯会员可以几个手机一起登录)

    腾讯会员可以几台设备登录(腾讯会员可以几个手机一起登录)

  • 红米k40双击息屏怎么用不了(红米k40双击熄灭屏幕不管用)

    红米k40双击息屏怎么用不了(红米k40双击熄灭屏幕不管用)

  • 荣耀30s是集成5G的吗(华为荣耀30s是集成5g吗)

    荣耀30s是集成5G的吗(华为荣耀30s是集成5g吗)

  • qq聊天字体的怎么设置(qq聊天字体怎么设置的和系统一样)

    qq聊天字体的怎么设置(qq聊天字体怎么设置的和系统一样)

  • 抖音能和对方视频吗(抖音可以和对方视频聊天吗?)

    抖音能和对方视频吗(抖音可以和对方视频聊天吗?)

  • 如何不打开红包查看红包金额(微信红包来了怎么设置提醒)

    如何不打开红包查看红包金额(微信红包来了怎么设置提醒)

  • 抖音有群发功能吗(抖音群发功能软件)

    抖音有群发功能吗(抖音群发功能软件)

  • 苹果还原所有设置和抹掉所有内容的区别(苹果还原所有设置会不会退出ID账号)

    苹果还原所有设置和抹掉所有内容的区别(苹果还原所有设置会不会退出ID账号)

  • 一个c类网络最多容纳多少台主机(一个C类网络最多可以容纳)

    一个c类网络最多容纳多少台主机(一个C类网络最多可以容纳)

  • 十代cpu和九代差距(十代cpu对比九代cpu)

    十代cpu和九代差距(十代cpu对比九代cpu)

  • 苹果x充电边框有电流(苹果x充电边框有电)

    苹果x充电边框有电流(苹果x充电边框有电)

  • 华为手机无故放音乐(华为手机放着不动自己响)

    华为手机无故放音乐(华为手机放着不动自己响)

  • TP-LINK验证码验证失败怎么回事(tplink安全码获取验证码)

    TP-LINK验证码验证失败怎么回事(tplink安全码获取验证码)

  • mq8g2ch/a是什么版本(mq8f2ch/a是什么版本)

    mq8g2ch/a是什么版本(mq8f2ch/a是什么版本)

  • 大陆微信在香港能用吗(大陆微信在香港能不能付款)

    大陆微信在香港能用吗(大陆微信在香港能不能付款)

  • opporeno咋关机(oppo reno手机怎样关机)

    opporeno咋关机(oppo reno手机怎样关机)

  • 为什么excel高级筛选老是只出现第一栏(为什么excel高级筛选老是应用无效)

    为什么excel高级筛选老是只出现第一栏(为什么excel高级筛选老是应用无效)

  • 手机关机了还掉电严重(手机关机了还掉电)

    手机关机了还掉电严重(手机关机了还掉电)

  • 华为新系统鸿蒙什么时候出(华为新系统鸿蒙和安卓有什么区别)

    华为新系统鸿蒙什么时候出(华为新系统鸿蒙和安卓有什么区别)

  • 拍夜景用多大光圈(拍夜景多大光圈合适)

    拍夜景用多大光圈(拍夜景多大光圈合适)

  • 手机动不了了怎么办(手机动不了怎么办按重启也按不了怎么办)

    手机动不了了怎么办(手机动不了怎么办按重启也按不了怎么办)

  • 摄像机连接小蜜蜂设置(摄像机连接小蜜蜂红灯没反应)

    摄像机连接小蜜蜂设置(摄像机连接小蜜蜂红灯没反应)

  • iphone 11什么时候上市(iphone 11什么时候发布的)

    iphone 11什么时候上市(iphone 11什么时候发布的)

  • 小米8呼叫转移怎么设置(小米8呼叫转移怎么设置和取消)

    小米8呼叫转移怎么设置(小米8呼叫转移怎么设置和取消)

  • 微信视频中再有人视频会有提示么(微信视频时再有视频进来)

    微信视频中再有人视频会有提示么(微信视频时再有视频进来)

  • 荣耀10如何截长图(荣耀如何截长屏方法)

    荣耀10如何截长图(荣耀如何截长屏方法)

  • 在BOIS如何设置启动项 启动方式怎么选择(bois如何设置启动项)

    在BOIS如何设置启动项 启动方式怎么选择(bois如何设置启动项)

  • 网速变慢的原因有哪些?(网速变慢的原因有哪些)

    网速变慢的原因有哪些?(网速变慢的原因有哪些)

  • 人人都可用chatgpt开发小项目(人人都能用英语pdf下载)

    人人都可用chatgpt开发小项目(人人都能用英语pdf下载)

  • lua命令  独立的Lua解释器(lua命令库)

    lua命令 独立的Lua解释器(lua命令库)

  • 所得税率率
  • 政府补贴的递延收益
  • 营业外收入是否属于当期损益
  • 融资租赁和经营性租赁区别
  • 企业残疾金的基数是多少
  • 处置投资性房地产的损益怎么算
  • 资产减值损失为正
  • 客运承运人是什么意思
  • 金税三期报税软件
  • 库存商品采用定价法
  • 电子承兑背书失败是怎么回事
  • 人民币结算意味着什么
  • 公司配股后,会迅速提高公司股票市价
  • 委托加工产品月末结转成本
  • 跨月红字发票可以作废吗
  • 2018劳务费个人所得税税率表
  • 房租怎么开票
  • 电子发票有发票代码吗
  • 准则大家学第十二集
  • 借现金还银行怎么做账
  • 企业收取房屋维修费用
  • 发票在验旧日期之后作废吗
  • 个税是应发工资扣,还是实发工资扣
  • 预收账款税收政策
  • 老板私车转让给老板
  • 押金算不算房租
  • 发放给职工
  • 盈余公积转增实收资本要交税吗
  • 预付加油充值卡可以报销吗
  • 幼儿园收入如何计算
  • 应付职工薪酬账户结构
  • 收到租金税费怎么计算
  • 苹果电脑录屏的视频保存在哪里
  • 劳务费费用
  • linux 管道命令详解
  • php语句和php变量都是区分大小写的
  • 质量赔偿款要交税吗
  • 体积最小的u盘
  • 大自然水族馆怎么样
  • 维多利亚瀑布有多高?多宽?
  • 关联方利息支出标准比例
  • 微信小程序从零
  • html爱心代码简单
  • 无形资产入股后如何处理
  • 其他应收款等于
  • 个人以不动产投资入股土地增值税
  • python并发和并行
  • 帐载金额
  • 增值税发票是记账联还是抵扣联
  • sql2008怎么查询
  • 啤酒的消费税
  • Windows下MySQL 5.6安装及配置详细图解(大图版)
  • 医疗费用属于什么费用
  • 如何确认产品销售收入
  • 增值税发票超过多久不能抵扣
  • 公司库存商品科目余额太大怎么办
  • 法人在公司账户取钱要纳税么
  • 什么是中型企业
  • 分配现金股利的顺序
  • 安装2个win10系统
  • linux文本处理常用命令
  • win7系统安装软件闪退
  • groove音乐怎么添加本地音乐
  • 苹果电脑如何制作
  • mac快捷键一览
  • linux如何拨号
  • win8怎么调整显示器亮度
  • linux cut-c
  • linux中ftp命令的用法
  • nodejs bff
  • perl快速入门
  • 使用粗盐热敷十大危害
  • 一张监控
  • jquery实现输入框自限制
  • jquery弹窗弹出一个页面
  • android+
  • c#入门实例
  • 河南省医保卡中心电话
  • 机票电子发票怎么作废
  • 驻马店燃气投诉电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设