SpringBoot 2.x -> 3.x 踩坑记录
原因:由于处理 3.12 的时候,我为了规避问题直接把生成的 Q 类复制到同级目录下,导致生成的 Q 类和已有 Q 类重复,无法生成。会导致不生成 Q 类,src/main/generated/里面的还是之前创建的 Q 类,创建时间不变化。方案:可以使用 idea 的迁移工具,替换依赖,再手动单点处理。报错是生成的 Q 类的 @Generated 注解爆红,方案:把之前拷贝出去的 Q 类删掉,由
一、现状:
JDK17SpringBoot 2.6.8Gradle 7.6
二、目标:
JDK17gradle 8.10.2SpringBoot 3.5.6无漏洞版本
三、问题:
1. import javax.*报错
原因:SpringBoot 2.x 使用 javax 规范,SpringBoot 3.x 使用 jakarta 规范。底层组件的包名全变了
方案:可以使用 idea 的迁移工具,替换依赖,再手动单点处理
2. 找不到 javax.servlet.http.HttpServletRequest 的类文件
List<FileItem> fileItems =(List<FileItem>) sevletFileUpload.parseRequest(request);
找不到javax.servlet.http.HttpServtetRequest的类文件
原因:common-fileupload-1.6.0 使用的是 javax 的 HttpServletRequest,而项目代码重构后,传入的是 jakarta 的 HttpServletRequest
方案:升级 commons-fileupload 为 org.apache.commons:commons-fileupload2-jakarta-servlet5:2.0.0-M2
3. commons-fileupload 从 commons-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
原因:注解处理器执行顺序的原因,可能是 mapstruct 和 lombok 执行冲突
- 把其他注解处理器都注释掉后,不会报该类错误了,猜测是注解处理器依赖冲突
- 逐个取消注释后,发现
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 类,创建时间不变化
方案:
步骤:
- 修改
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/")
}
- 修改后会在 Q 类的
@Generated报错了 - 见 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 里面用的是 javax,Filter 升级到了 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.yml,spring.jpa.database-platform 的值从 org.hibernate.dialect.MySQL57InnoDBDialect 到 org.hibernate.dialect.MySQLDialect
18. 报错 java.lang.ClassNotFoundException: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
方案:修改 application.yml,spring.jpa.properties.hibernate.physical_naming_strategy 的值从 org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy 到 org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
更多推荐


所有评论(0)