当前位置: 首页 > news >正文

SpringBoot 2.x - 3.x 踩坑记录

一、现状:

  • JDK17
  • SpringBoot 2.6.8
  • Gradle 7.6

二、目标:

  • JDK17
  • gradle 8.10.2
  • SpringBoot 3.5.6 无漏洞版本

三、问题:

1. import javax.*报错

原因:SpringBoot 2.x 使用 javax 规范,SpringBoot 3.x 使用 jakarta 规范。底层组件的包名全变了

方案:可以使用 idea 的迁移工具,替换依赖,再手动单点处理
image.png

2. 找不到 javax.servlet.http.HttpServletRequest 的类文件

List<FileItem> fileItems =(List<FileItem>) sevletFileUpload.parseRequest(request);
找不到javax.servlet.http.HttpServtetRequest的类文件

原因:common-fileupload-1.6.0 使用的是 javaxHttpServletRequest,而项目代码重构后,传入的是 jakartaHttpServletRequest

方案:升级 commons-fileuploadorg.apache.commons:commons-fileupload2-jakarta-servlet5:2.0.0-M2

3. commons-fileuploadcommons-fileupload:commons-fileupload:1.6.0 升级到 org.apache.commons:commons-fileupload2-jakarta-servlet5:2.0.0-M2 后,ServletFileUpload sevletFileUpload = new ServletFileUpload(factory); 报错找不到 ServletFileUpload

方案:替换为 JakartaServletFileUpload sevletFileUpload = new JakartaServletFileUpload(factory);

4. DiskFileItemFactory factory = new DiskFileItemFactory();报错

原因:1.x 升 2.x 后,DiskFileItemFactory 的构造方案改成私有的了

方案:修改实现为 DiskFileItemFactory factory = DiskFileItemFactory.builder().get();

5. 报错 Could not find org.hibernate:hibernate-core:.

方案:修改为 annotationProcessor "org.hibernate:hibernate-core:6.4.10.Final"

6. 注解 @TypeDef 不存在

原因:hibernate-core:6.x 移除了 @TypeDef 注解

方案:删除 @TypeDef 的使用,将 @Type(type = "json") 修改为 @Type(value = JsonStringType.class)

7. LocalVariableTableParameterNameDiscoverer 找不到

SpringBoot3.x 移除了该类

方案:修改为 StandardReflectionParameterNameDiscoverer

8. 错误: 找不到符号 xxx.model.mysql.QTaskDetailDO;

原因:QTaskDetailDO 中使用了 @Generated 注解,这个注解在 rt.jar 中。spring 升级后默认不带这个 jar 包了

方案:.gradle增加implementation "com.auth0:java-jwt:3.2.0"

9. 注解 @EnableSwagger2WebMvc 不存在

报错:import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; 中的 EnableSwagger2WebMvc 爆红

方案:手动引入 io.springfox:springfox-spring-web:2.9.2

10. ByteSource.Util.bytes 爆红

原因:shiro-core 从 1.10.升级到 2.0 后,ByteSource 被移除

方案:直接替换为内部实现,把 ByteSource.Util.bytes(salt)修改为 new SimpleByteSource(userDTO.getSalt())

11. 报错找不到 @SuperBuilder

原因:注解处理器执行顺序的原因,可能是 mapstructlombok 执行冲突

  • 把其他注解处理器都注释掉后,不会报该类错误了,猜测是注解处理器依赖冲突
  • 逐个取消注释后,发现 annotationProcessor "com.vladmihalcea:hibernate-types-60:2.21.1"annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jpa" 都会导致 lombok 不生效

方案:

删除 hibernate-types-60,修改 querydsl 的引入方式为 annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta"

12. 报错找不到 QTaskDetailDO(Q 类)

项目中使用了 querydsl 5.0.0,且正常指定了 annotationProcessor。报错是生成的 Q 类的 @Generated 注解爆红,import jakarta.annotation.processing.Generated; 中的 processing 爆红。但是 IDE 只显示找不到 Q 类

原因:gradle 升级后,配置需要更新。会导致不生成 Q 类,src/main/generated/里面的还是之前创建的 Q 类,创建时间不变化

方案:

步骤:

  1. 修改 gradle 文件,Q 类的源目录。Gradle 版本 8.10.2
修改前:
compileJava {options.generatedSourceOutputDirectory = file("src/main/generated/")
}修改后:
sourceSets.main.java.srcDir "src/main/generated/"
compileJava {
//    options.generatedSourceOutputDirectory = file("src/main/generated/")
}
  1. 修改后会在 Q 类的 @Generated 报错了
  2. 见 3.13.5,需要使用 jakarta 规范的包

13. jakarta & javax 适配报错

13.1 shiro 版本升级

@Bean("shiroFilter")
public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//添加自己的过滤器Map<String, Filter> filterMap = new HashMap<>();filterMap.put("jwt", new JWTFilter());factoryBean.setFilters(filterMap);factoryBean.setSecurityManager// 类型不匹配提示:Required type: Map<String, javax.servlet.Filter>Provided: Map<String, jakarta.servlet.Filter>

原因:ShiroFilterFactoryBean 里面用的是 javaxFilter 升级到了 jakarta,导致不兼容

参考[Feature] ShiroFilterFactoryBean with Jakarta Filter compatibility · Issue #1428 · apache/shiro

方案:

// 修改前
implementation "org.apache.shiro:shiro-spring-boot-starter:2.0.0"// 修改后
implementation platform("org.apache.shiro:shiro-bom:2.0.1")
implementation group: 'org.apache.shiro', name: 'shiro-core', classifier: 'jakarta'
implementation group: 'org.apache.shiro', name: 'shiro-web', classifier: 'jakarta'
implementation group: 'org.apache.shiro', name: 'shiro-spring', classifier: 'jakarta'

13.2. sentinel 版本升级

sentinel 不支持 jakarta 规范,鉴于工期紧张,采用删除组件的方案

13.3. commons-fileupload 版本升级

现在采用的是 commons-fileupload:1.5。传入的是 jakarta,但是方法需要传入 javax

方案:升级到 org.apache.commons:commons-fileupload2-jakarta:2.0.0-M1

13.4 querydsl 版本升级

报错:

@Bean
@Primary
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {return new JPAQueryFactory(entityManager); ƍ
}// 编译错误提示:
Cannot resolve constructor 'JPAQueryFactory(EntityManager)'
Cast argument to 'Supplier<EntityManager>'

原因:报错本质是 JPAQueryFactory 中使用的是 javax.persistence.EntityManager.EntityManager,没有使用 jakarta 规范

方案:

// 修改前
implementation "com.querydsl:querydsl-jpa:5.1.0"
annotationProcessor "com.querydsl:querydsl-apt:5.1.0"// 修改后
implementation "com.querydsl:querydsl-jpa:5.1.0:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta"

14. 错误: Attempt to recreate a file for type xxx.QSysRolePermissionDO

报错:

原因:由于处理 3.12 的时候,我为了规避问题直接把生成的 Q 类复制到同级目录下,导致生成的 Q 类和已有 Q 类重复,无法生成

方案:把之前拷贝出去的 Q 类删掉,由 jpa 来自动生成

15. java.time.zone.ZoneRulesException: Unknown time-zone ID: timeZone_IS_UNDEFINED

原因:logback.xml 加载早于 spring,导致取不到 application.yaml 中定义的时区变量值

方案:修改 logback.xml 文件名为 logback-spring.xml

16. Invalid bean definition with name 'xxx.EssGatewayClient' defined in null: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String

方案:springCloudVersion 版本从 2022.0.4 升级到 2025.0.0

17. 报错 java.lang.ClassNotFoundException: org.hibernate.dialect.MySQL57InnoDBDialect

方案:修改 application.ymlspring.jpa.database-platform 的值从 org.hibernate.dialect.MySQL57InnoDBDialectorg.hibernate.dialect.MySQLDialect

18. 报错 java.lang.ClassNotFoundException: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

方案:修改 application.ymlspring.jpa.properties.hibernate.physical_naming_strategy 的值从 org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyorg.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

http://www.jsqmd.com/news/48789/

相关文章:

  • 广州比较好的留学机构
  • 配置文件路径
  • AtCoder Beginner Contest 433 题解
  • 使用 Lua 语言识别英文数字验证码
  • 广州10大出国留学机构
  • 北京留学机构,谁知道哪家比较好
  • 北京留学读研中介机构推荐
  • 北京留学机构排行榜
  • 北京口碑最好的十大留学机构
  • 北京口碑最好的留学机构
  • 用 Kotlin 实现简单的文本处理程序
  • 北京口碑比较好的留学中介
  • 北京出国留学的机构哪家好
  • 北京出国留学的机构哪个好
  • 北京比较靠谱的留学中介
  • 北京比较好的留学机构
  • 北京10大出国留学机构
  • Upgrade Your Universal Audi-Style 3-Button Smart Key with KEYDIY MLB08 434MHz Non-OEM PCB
  • 分库分表问题
  • 数据采集作业3 102302111 海米沙
  • KEYDIY PAK09 Phone As Key: Smart Keyless Entry Remote Control for European/American Vehicles
  • 2025年11月23日
  • 鸡哥防守关云长
  • 论文里面的正体、斜体、加粗
  • L2-027 名人堂与代金券
  • 2025年数字人厂商最新推荐榜:AI数字人、IP、虚拟、数字人视频制作、数字人制作、数字人直播、数字人电商、自媒体、智能数字人
  • 2025年数字人全链路智能创作平台完全指南
  • 每日反思(2025年11月23日)
  • 学习率调度算法的演进与优化
  • 数字人平台指南:聚焦四大关键维度,破解选型难题