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

  • 增值税可以退税嘛
  • 特殊行业包括哪些
  • 旅游费用可以报销吗
  • 往来账审计存在问题及建议
  • 应交税费应交增值税减免税款
  • 企业所得税税前扣除和不扣除的区别
  • 企业所得税中管理费用怎么填列
  • 资产收益权转让产品
  • 公司没车但是有加油费发票怎么处理?
  • 销售不动产包括哪些内容
  • 同一客户应收应付可以相互抵消吗
  • 公司进项销项税差异较大
  • 一个人有多份工作
  • 企业管理与咨询机构
  • 评估入账的开发权是否可以税前扣除?
  • 税控系统全额抵扣增值税申报
  • 学校的房子归哪里管
  • 定期存款要交利息税吗
  • 处置打包债权如何缴纳个人所得税?
  • 应收账款周转天数正常范围
  • 股东净利润是什么
  • 资产处置收益计入哪个会计科目
  • 小规模10万以下免税分录
  • 个税申报错误怎么更改
  • 如何向企业支付宝收款
  • 车辆购置税如何计算器
  • 企业微信api错误码
  • 苹果如何保护
  • 王者荣耀中廉颇是哪一个族的族长
  • 支付航天信息服务费怎么入账
  • 毕业设计-基于组态软件的流量比值过程控制系统设计
  • windows2022下载
  • maven安装成功命令
  • javascript基础类型
  • 被黑客攻击
  • 预算会计的核算对象是什么
  • 租赁房屋开具发票商品名称
  • 个人发票抬头和公司发票抬头有什么区别
  • 财务报表申报后怎么修改
  • 销售费用福利费和管理费用福利费
  • 调减加计抵减额什么意思
  • sql初学者视频教程
  • 收到发票未收到货物
  • 饭馆增值税
  • 资产减值损失是什么意思
  • 免税收入就是不征收收入,均属于税收优惠范畴
  • 调整以前月份的管理费用怎么做
  • 物业公司管理费用都有哪些科目
  • 对非本单位的营销方案
  • 工程主营业务收入会计分录
  • 认购股份的形式主要有
  • 其他应收款款项性质如何填写
  • sqlserver 查看表
  • sqlserver2000数据库迁移到2008r2
  • win8 联网
  • win2000注册表
  • 如何修改windows注册表
  • 图形工具的作用
  • ubuntu configure
  • win10系统无法卸载补丁
  • 无人值守工厂
  • linux的用户
  • 重装win7系统后没有无线网
  • linux sed
  • ie 无法打开
  • 晚上睡觉艾草贴肚脐
  • 汤姆猫arcode
  • opengl基础知识
  • 如何搭建react项目
  • ubuntu搭建ss
  • AJAX和jQuery动态加载数据的实现方法
  • android保存文件到本地
  • unity gpu优化
  • Android带有注册界面的简单app
  • easyui-dialog
  • js正则匹配数字
  • jquery怎么实现分页功能
  • 财税刘毅
  • 烟丝和烟有什么区别
  • 消费发票上的金额含税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设