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

  • 微信怎么搜50米以内的人(微信可以搜到50米内的人吗)

    微信怎么搜50米以内的人(微信可以搜到50米内的人吗)

  • 发微信想空两格怎么办(微信发文字空格到第二行)

    发微信想空两格怎么办(微信发文字空格到第二行)

  • 趣影怎么取消会员(趣影科技是什么app)

    趣影怎么取消会员(趣影科技是什么app)

  • 手机号换了快手登不上怎么办(手机号换了快手还能用吗)

    手机号换了快手登不上怎么办(手机号换了快手还能用吗)

  • 电信基站对人体有辐射吗(电信基站是干嘛的)

    电信基站对人体有辐射吗(电信基站是干嘛的)

  • 华为休眠时间怎么设置成永久(华为休眠时间怎么设置不了)

    华为休眠时间怎么设置成永久(华为休眠时间怎么设置不了)

  • 华为p40手机恢复出厂设置在哪里(华为P40手机恢复出厂设置充电会变慢吗)

    华为p40手机恢复出厂设置在哪里(华为P40手机恢复出厂设置充电会变慢吗)

  • 快手点赞马上取消对方知道吗(快手点赞马上取消会看到吗)

    快手点赞马上取消对方知道吗(快手点赞马上取消会看到吗)

  • 手机震动模式怎么调(手机震动模式怎么不震动)

    手机震动模式怎么调(手机震动模式怎么不震动)

  • 苹果11突然死机是怎么回事(苹果11突然死机了 关不了 咋办)

    苹果11突然死机是怎么回事(苹果11突然死机了 关不了 咋办)

  • 手机卡副卡和主卡有什么联系(手机卡副卡和主卡是一个身份证吗)

    手机卡副卡和主卡有什么联系(手机卡副卡和主卡是一个身份证吗)

  • oppoa8和a11有什么区别(oppo a11和a8)

    oppoa8和a11有什么区别(oppo a11和a8)

  • ios11beat版是什么意思(ios11 beta1)

    ios11beat版是什么意思(ios11 beta1)

  • 华为怎么退出盲人模式(华为怎么退出盲人模式怎么解锁屏幕)

    华为怎么退出盲人模式(华为怎么退出盲人模式怎么解锁屏幕)

  • 手机怎么设动态壁纸(手机怎么设动态图壁纸)

    手机怎么设动态壁纸(手机怎么设动态图壁纸)

  • 苹果xr锁屏手电筒移除(苹果xr锁屏界面的手电筒为什么开不了)

    苹果xr锁屏手电筒移除(苹果xr锁屏界面的手电筒为什么开不了)

  • 条形码在哪个部门申请(条形码在哪个部门查)

    条形码在哪个部门申请(条形码在哪个部门查)

  • 怎么区分ic和id卡(如何区别ic和id)

    怎么区分ic和id卡(如何区别ic和id)

  • 多多商客要实名认证吗(拼多多商家实名认证)

    多多商客要实名认证吗(拼多多商家实名认证)

  • 出租微信号投票安全吗(出租微信号投票有风险吗)

    出租微信号投票安全吗(出租微信号投票有风险吗)

  • 同步推怎么安装(同步推怎么下载软件)

    同步推怎么安装(同步推怎么下载软件)

  • google搜索打不开?(google搜索打不开怎么办)

    google搜索打不开?(google搜索打不开怎么办)

  • 开机时无需按Ctrl+Alt+Del(电脑开机需要按ctrl+alt+del怎么取消)

    开机时无需按Ctrl+Alt+Del(电脑开机需要按ctrl+alt+del怎么取消)

  • 非税项目明细代码
  • 作家以及作品
  • 用友软件销售操作流程
  • 购买非专利技术发生的手续费计入什么科目
  • 不是本单位职工可以报销差旅费吗
  • 动漫产业增值税优惠政策
  • 工作过失扣工资合法吗
  • 在建工程工伤保险
  • 去年的成本没有入账
  • 贴现费用计算公式
  • 材料采购合同要盖章吗
  • 免费样品销售给客户计入什么科目
  • 招待费进项税额转出会计分录
  • 扶贫算出差吗
  • 公司收到股东的投资款以后怎么处理
  • 增值税普通发票和普通发票的区别怎么交税
  • 建安业核定征收利润率
  • 关于建筑工程发包与承包下列说法正确的是
  • 承包方给发包方付费
  • 调整薪酬结构
  • 汽车发票金额怎么算
  • 车辆购置税完税证明电子版二维码怎么扫
  • 电子发票无法预览怎么弄
  • 移动电子发票显示无法开具怎么获取发票
  • 电池消费税征税范围
  • 1697509557
  • 收到退回去年增值税怎么做账
  • 采购材料的运费怎么做分录
  • 开票收入怎么理解
  • 视同买断委托代销如何确认纳税时间?
  • 车间日常维修费用计入什么科目
  • 未开票收入如何记账
  • 付款后收到发票怎么写摘要
  • 产负债表的负债项目,显示了企业所负担债务的
  • 怎么激活win10专业版
  • 使用电子计算机生成的会计凭证
  • vue3刷新组件
  • 树枝上停着一只什么小鸟
  • vue查看图片组件
  • 油卡预付卡发票能入费用吗怎么入账
  • java基础网络编程
  • matching path
  • 会计分录结转进项怎么算
  • 集团公司内部结算
  • 库存商品用于研发要进项税额转出吗
  • centos编译运行c程序
  • mongodb $sum
  • 固定资产折旧会影响净利润吗
  • 收到备用金会计分录
  • 月报表该怎么做表格
  • 收到对方公司的货款怎么记账
  • 发票申请退税隔两个月能去办理么
  • 福利企业增值税退税标准
  • 客户给的现金如何转到公司账上
  • 印花税根据一个月的销售额来计提吗
  • 人力资源服务费是什么意思
  • 一般企业报税的税种
  • 发票提前开能入费用吗?
  • 资本公积其他资本公积用途
  • 安装mysql的总结
  • CentOS6.7 mysql5.6.33修改数据文件位置的方法
  • 怎么看solaris版本
  • mmc无法创建管理单元win10
  • win7系统锁屏密码
  • Win10系统如何开启全部权限
  • win7小喇叭有个红叉
  • windows7与xp
  • wps文字打印不清楚怎么办
  • windows任务栏变色
  • linux的安装
  • 教你三招让电脑打字
  • nodejs socket框架
  • python生成txt文档
  • 手游 unity
  • Android开发工具
  • javascript ts
  • jquery选择器总结
  • javascript definitive guide
  • 江苏小孩医保网上缴费
  • 个体户注销还要交税吗?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设