位置: 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安装不了)

  • APP活动运营,其实你一直在“骚扰”用户?(app的运营计划)

    APP活动运营,其实你一直在“骚扰”用户?(app的运营计划)

  • 手机QQ浏览器书签怎么恢复(手机qq浏览器书签删除了怎么恢复)

    手机QQ浏览器书签怎么恢复(手机qq浏览器书签删除了怎么恢复)

  • 苹果音乐怎么播放不了(苹果音乐怎么播放喜欢列表)

    苹果音乐怎么播放不了(苹果音乐怎么播放喜欢列表)

  • 苹果11没有正方形拍照吗(苹果11没有正方形吗)

    苹果11没有正方形拍照吗(苹果11没有正方形吗)

  • 抖音的标签在哪里设置(抖音的标签在哪贴)

    抖音的标签在哪里设置(抖音的标签在哪贴)

  • 新浪微博怎么改名字(新浪微博怎么改备注)

    新浪微博怎么改名字(新浪微博怎么改备注)

  • 锁屏动画怎么设置(锁屏动态怎么弄)

    锁屏动画怎么设置(锁屏动态怎么弄)

  • 笔记本电脑相机打开是黑的(笔记本电脑相机无法使用怎么办)

    笔记本电脑相机打开是黑的(笔记本电脑相机无法使用怎么办)

  • 语音能转发给别人吗(语音能转发给别人听吗怎么弄)

    语音能转发给别人吗(语音能转发给别人听吗怎么弄)

  • 抖音下载不了的视频怎么保存(抖音下载不了的视频怎么弄)

    抖音下载不了的视频怎么保存(抖音下载不了的视频怎么弄)

  • 哔咔哔咔注册不了是怎么回事(哔咔哔咔注册不成功)

    哔咔哔咔注册不了是怎么回事(哔咔哔咔注册不成功)

  • 快手作品推广能涨粉吗(快手上作品推广有用吗)

    快手作品推广能涨粉吗(快手上作品推广有用吗)

  • 电脑显示器黑屏但灯亮一闪一闪的(电脑显示器黑屏但灯亮主机正常运行)

    电脑显示器黑屏但灯亮一闪一闪的(电脑显示器黑屏但灯亮主机正常运行)

  • xp本地连接创建不了

    xp本地连接创建不了

  • 三星s10翻新机怎么辨别(三星翻新手机)

    三星s10翻新机怎么辨别(三星翻新手机)

  • 局域网的简称是什么(局域网的英文缩写为( ))

    局域网的简称是什么(局域网的英文缩写为( ))

  • 抖音身份证被别人认证了(抖音身份证被别人用了怎么办)

    抖音身份证被别人认证了(抖音身份证被别人用了怎么办)

  • airpods支持以旧换新么(airpod能以旧换新吗)

    airpods支持以旧换新么(airpod能以旧换新吗)

  • 华为拉黑电话提示什么(华为电话拉黑了对方还能收到电话提醒吗)

    华为拉黑电话提示什么(华为电话拉黑了对方还能收到电话提醒吗)

  • 手机qq怎么找人工客服(手机qq怎么找人工在线客服)

    手机qq怎么找人工客服(手机qq怎么找人工在线客服)

  • 什么叫手机分辨率(什么是手机分辨率?)

    什么叫手机分辨率(什么是手机分辨率?)

  • 苹果x隐藏照片怎么加密(苹果x隐藏照片怎么找出来呀)

    苹果x隐藏照片怎么加密(苹果x隐藏照片怎么找出来呀)

  • 监控画面怎么切换位置(监控画面怎么切换电视)

    监控画面怎么切换位置(监控画面怎么切换电视)

  • 计提的增值税和实际缴纳的差额
  • 分公司可以独立承担法律责任吗
  • 车间人员负担的工会经费
  • 季度盈利可以弥补以用以前年度亏损弥补
  • 个体工商户核定征收税率
  • 固定资产减少当月
  • 销售自己使用过的物品
  • 出纳工作的七大技巧
  • 内部往来科目设置在哪类下
  • 购进材料无发票会计分录
  • 待处置资产损溢在什么科目
  • 个体户国税异常怎么办
  • 劳务费发票和建筑劳务费发票
  • 商誉摊销法的优缺点
  • 企业部门借备用金流程
  • 一般风险准备金计算公式
  • 结转固定资产净收益8万元
  • 坏账准备对利润表
  • 应收账款的账面余额公式
  • 以土地使用权投资入股的土地增值税
  • 去年的记账凭证错了怎么办
  • 怎么计提企业所得税在哪里知道计提多少
  • 暂估入库后结转成本
  • unity默认存储路径
  • 期初留存收益是什么科目
  • 一只躺在沙滩上的鸟
  • 财务费用明细科目怎么写
  • 固定资产加速折旧方法
  • php操作mysql数据库的扩展有哪三个
  • 前端get请求传数组
  • 什么叫web渗透测试
  • dematel模型有什么缺点
  • java web中的转发和重定向
  • php命令大全
  • 残障金什么时候开始交
  • 计提工会经费的标准
  • 公司账户转账给个人要交税吗
  • 进项转出了还能再转进去吗
  • 公司签发银行承兑汇票的行为属于什么行为
  • 成品油涉及范围有哪些
  • 防伪码显示查询次数和时间
  • 省市县三级联动工作机制
  • 设计公司成本核算分录
  • 服务业的收入确认原则
  • 注销的企业
  • 应纳税调增调减科目是什么
  • 出差在火车上算上班吗
  • 交通运输行业指什么
  • 给业务员的佣金怎么做账
  • 粗纤维测定仪价格
  • 不属于投资性房地产项目有自用房地产作为存货的
  • 母公司帮子公司代缴社保
  • 现金日记账的对账工作有哪些
  • linux软件安装源
  • 电脑开机怎么设置默认系统
  • win10怎么设置pdf默认打开方式是wps
  • 不用光盘不用u盘怎么安装系统
  • window svn
  • ubuntu怎样调出命令行
  • macxi
  • wlms.exe是什么
  • win10缺少文件怎么办
  • oodag.exe - oodag是什么进程 有什么作用
  • Win10 Mobile 10586.71截图曝光 修复已知问题
  • coco包装设计
  • Visual Studio 2013 Tools for Unity安装目录,Visual Studio 2013 Tools.unitypackage
  • Eclipse引入jdk1.8
  • android方法大全
  • shell脚本spawn
  • jquery图片轮播视频
  • python如何开发
  • js特殊字符有哪些
  • nodejs重命名文件
  • javascript怎么做
  • python 系统日期
  • input checked选择
  • jquery自定义组件
  • python中的字符串的英文
  • 广东省国家税务总局稽查局局长
  • 如何在网上开税票发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设