本文根据newbeemall项目升级SpringBoot3.0踩坑总结,附更新说明:Spring-Boot-3.0-ReleaseNotesSpring-Boot-3.0。0-M5-ReleaseNote1.编译错误,importjavax.servlet.*;不存在这个错误主要是因为SpringBoot3.0已经将所有的依赖从JavaEE迁移到了JakartaEEAPI,导致servlet包名的修改,Spring团队之所以这样做,主要是为了避免Oracle的版权问题.解决方法很简单,两步:1添加jakarta.servlet依赖jakarta.servletjakarta.servlet-api修改导入依赖项目所有代码修改前:importjavax.servlet.*修改后:importjakarta.servlet.*2.升级很多附带的依赖包导致部分代码写过期告警2.1Thymeleaf升级到3.1.0.M2,日志打印告警14:40:39.936[http-nio-84-exec-15]WARNo.t.s.p.StandardIncludeTagProcessor-[doProcess,67]-[THYMELEAF][http-nio-84-exec-15][admin/goods/goods]在模板admin/goods/goods的第4行,第15列中找到了已弃用的属性{th:include,data-th-include}。请改用{th:insert,data-th-insert},此已弃用的属性将在Thymeleaf的未来版本中被删除。14:40:39.936[http-nio-84-exec-15]警告o.t.s.p.AbstractStandardFragmentInsertionTagProcessor-[computeFragment,385]-[THYMELEAF][http-nio-84-exec-15][admin/goods/goods]已弃用展开的片段表达式“admin/header::header-fragment"在模板admin/goods/goods中找到,第4行,第15列。请改用片段表达式的完整语法("~{admin/header::header-fragment}")。在Thymeleaf的未来版本中,将删除片段表达式的旧的、未包装的语法。可见作者还是很用心的,更新后的写法已经在日志中给出了。修改如下:修改前:修改后:2.2Thymeleaf升级到3.1.0.M2,后端使用thymeleafViewResolver手动渲染网页代码错误//修改前的SpringBoot2.7:WebContextctx=new(request,response,request.getServletContext(),request.getLocale(),model.asMap());html=thymeleafViewResolver.getTemplateEngine().process("mall/seckill-list",ctx);上面代码中创建WebContext对象报错,这里直接改成新版的写法//修改SpringBoot3.0:JakartaServletWebApplicationjakartaServletWebApplication=JakartaServletWebApplication.buildApplication(request.getServletContext());WebContextctx=newWebContext(jakartaServletWebApplication.buildExchange(request,response),request.getLocale(),model.asMap());html=thymeleafViewResolver.getTemplateEngine().process("mall/秒杀-list",ctx);3.Massive第三方库对SpringBoot的starter依赖失效,导致项目启动报错。原因:SpringBoot3.0自动配置注册spring.factories已被废弃,改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports写法,导致大量第三方启动依赖失效,这么重要的变化在Spring官方的Spring-Boot-3.0-中并没有包含发行说明,并放在Spring-Boot-3.0.0-M5-发行说明中。配置SpringBoot3.0根据SpringBoot3.0的要求,在项目资源下新建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,手动将第三方库的spring.factories添加到imports中,这样就可以手动修复第三方库springbootstarter依赖失效问题。4.MybatisPlus依赖问题Mybatisplus最新版本还是3.5.2,它依赖的mybatis-spring版本是2.2.2(mybatis-spring发布了3.0.0版本来适配SpringBoot3.0),这样会导致项目中的sql查询直接报错。这主要是由于SpringBoot3.0中删除了NestedIOException类。在Springboot2.7这个类还存在,给个类描述截图这个类在2.7已经被标记为obsolete,建议用IOException代替,在Mybatisplus3.5.2仍然使用下面是问题的截图MybatisSqlSessionFactoryBeanThisclassisstillusingNestedIOExceptionViewMybatisplus官方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")公共类HikariCpConfig{@BeanpublicMybatisPlusInterceptormybatis()PlusMybatisPlusInterceptor拦截器=newMybatisPlusInterceptor();interceptor.addInnerInterceptor(newPaginationInnerInterceptor(DbType.MYSQL));返回拦截器;}@Bean(name="masterDataSource")@ConfigurationProperties(prefix="spring.datasource.master")公共数据源masterDataSource(){返回新的HikariDataSource();}/***@paramdatasource数据源*@returnSqlSessionFactory*@Primary默认SqlSessionFactory*/@Bean(name="masterSqlSessionFactory")publicSqlSessionFactorymasterSqlSessionFactory(@Qualifier("masterDataSource")DataSource数据源,Interceptor拦截器,MybatisPlusProperties属性)抛出异常{MybatisSqlSessionFactoryBeanbean=newMybatisSqlSessionFactoryBean();bean.setDataSource(数据源);//包含mybatisplus的自动配置写法bean.setMapperLocations(properties.resolveMapperLocations());如果(properties.getConfigurationProperties()!=null){bean.setConfigurationProperties(properties.getConfigurationProperties());}if(StringUtils.hasLength(properties.getTypeAliasesPackage())){bean.setTypeAliasesPackage(属性.getTypeAliasesPackage());}bean.setPlugins(拦截器);GlobalConfigglobalConfig=properties.getGlobalConfig();bean.setGlobalConfig(globalConfig);log.info("----------------------------------------masterDataSource配置成功");返回bean.getObject();}@Bean("masterSessionTemplate")publicSqlSessionTemplatemasterSessionTemplate(@Qualifier("masterSqlSessionFactory")SqlSessionFactorysqlSessionFactory){返回新的SqlSessionTemplate(sqlSessionFactory);}}至此,项目可以正常运行latest,解决了部分历史问题,并逐步适配graalvmforcloudprototype需求。总之,作为技术开发者,希望更多的开发者去尝试SpringBoot3.0带来的新变化