一、现状:

  • 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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐