java项目从1.8升级到21走过的坑

最近做了从java1.8升级到java21,springboot从2.x升级到3.x的工作,发现遇到很多问题,花了很多时间,我想其他人可能也会遇到类似问题,故整理了这篇文章,同时也非常感谢文中引用文章的作者,提供了很宝贵的参考,加速了我解决问题的时间。

一、参考文档

1. Spring Boot 2.x 到 3.2 的全面升级指南

https://didispace.blog.csdn.net/article/details/135282975

2. Spring Boot 从2.1.x 升级到3.0.x的艰辛历程

https://blog.csdn.net/goalietang/article/details/134703888

3. 关于Spring Boot 2.x升3.x的那些事

https://blog.csdn.net/arbiterlk/article/details/131983719

4. springboot2.x升级到springboot3.0遇到的问题

https://blog.csdn.net/weixin_42930944/article/details/136509461

5. springBoot2 升级springBoot3问题记录

springBoot2 升级springBoot3问题记录_sptingboot项目升级springboot3-CSDN博客

6. sprringboot3整合springsecurity6.0(只做token权限验证)+redis+自定义权限验证+自定义操作日志

https://blog.csdn.net/weixin_44900881/article/details/131436527

二、 java项目从java 1.8升级到java 21所做修改  使用idea工具

安装jdk21, maven版本需要3.9以上

2.1. 将SDK修改为java 21

   File/Project Structure

  

project-> sdk和language level都修改为21

modules-> Sources  -> language level和dependencies都修改为21,每个单独修改

2.2 将java compile改成21

2.3 修改pom.xml中的java version,compiler配置

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8

</project.reporting.outputEncoding>
<
maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<
maven.compiler.source>21</maven.compiler.source>
<
maven.compiler.target>21</maven.compiler.target>
<
maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
<
java.version>21</java.version>
<
skipTests>true</skipTests>

2.3 将springboot由2.x改成3.2.4

不做这个修改,编译会报错。Springboot 2.x不支持java 21

 

2.4 SpringBoot3版本升级问题

在SpringBoot3版本中将javax.servlet.http.HttpServletRequest更换为jakarta.servlet.http.HttpServletRequest

程序包javax.servlet.http不存在,将所有 javax 的 imports 都替换为 Jakarta

        

Pom.xml中删除javax相关内容,后续需要升级jwt版本

2.5 SpringSecuirity整体修改

https://blog.csdn.net/cygqtt/article/details/134557096

  1. HttpSecurity中antMatchers弃用

处理同2

  1. WebSecurityConfigurerAdapter不存在

@Configuration

@EnableWebSecurity

public class ElcSecurityConfig {



    @Autowired

    private IgnoreUrlsConfig ignoreUrlsConfig;

    @Autowired

    private RestfulAccessDeniedHandler restfulAccessDeniedHandler;

    @Autowired

    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired

    private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;

    @Autowired(required = false)

    private DynamicSecurityService dynamicSecurityService;

    @Autowired(required = false)

    private DynamicSecurityFilter dynamicSecurityFilter;



    @Bean

    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        //有动态权限配置时添加动态权限校验过滤器

        if(dynamicSecurityService!=null){

            http.addFilterBefore(dynamicSecurityFilter, FilterSecurityInterceptor.class);

        }

        // 基于 token,不需要 csrf

        http.csrf(csrf -> csrf.disable())

        // 基于 token,不需要 session

        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))

        // 禁用basic明文验证

        .httpBasic(basic->basic.disable())

        // 禁用默认登录页

        .formLogin(login->login.disable())

        // 禁用默认登出页

        .logout(logout->logout.disable())

        // 设置 处理认证失败、鉴权失败处理器

        .exceptionHandling(exceptionHandling -> exceptionHandling

                .authenticationEntryPoint(restAuthenticationEntryPoint)

                .accessDeniedHandler(restfulAccessDeniedHandler))

        // 加我们自定义的过滤器,替代UsernamePasswordAuthenticationFilter

        .addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)

        // 设置 匿名访问url

        .authorizeHttpRequests((authorize) -> authorize

                .requestMatchers(HttpMethod.GET, ignoreUrlsConfig.getUrls().toArray(new String[0])).permitAll()

                .requestMatchers(HttpMethod.POST, ignoreUrlsConfig.getUrls().toArray(new String[0])).permitAll()

                .requestMatchers(HttpMethod.OPTIONS).permitAll()

                .anyRequest().authenticated());

        return http.build(); // 返回构建的SecurityFilterChain实例

    }

}

3. Can't configure mvcMatchers after anyRequest

Can‘t configure antMatchers after anyRequest_can't configure antmatchers after anyrequest-CSDN博客

有多个白名单,统一放在这个前面。

.anyRequest().authenticated()任何请求都需要授权,注意要把它放最后面

// 设置 匿名访问url

.authorizeHttpRequests((authorize) -> authorize

        .requestMatchers(HttpMethod.GET, ignoreUrlsConfig.getUrls().toArray(new String[0])).permitAll()

        .requestMatchers(HttpMethod.OPTIONS).permitAll()

        .anyRequest().authenticated());

2.6 MyBatis问题修改

1.java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are require

2.Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String

SpringBoot3整合MyBatis报错:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required_mybatis_程序员十三-华为云开发者联盟

发现 NestedIOException 这个类在 Spring 6 版本中直接删除了.

需要将mybatis-spring-boot 升级到 3.0.0 ,同时排出原有的mybatis-spring

如果你的springboot版本3.2.0,则需要将你的mybatis-spring升级到3.0.3

https://www.cnblogs.com/quhg/p/18188379

某个类的 factoryBeanObjectType 属性类型与配置类型不符合,导致报错,有大佬表示,Spring 从初版就会存在这个问题,不过当时对于这个问题采取了忽略处理,但新版本的 Spring 采取报错来处理

mybatis-spring 需要使用3.0.3

<dependency>

    <groupId>org.mybatis</groupId>

    <artifactId>mybatis-spring</artifactId>

    <version>3.0.3</version>

</dependency>

<dependency>

    <groupId>com.baomidou</groupId>

    <artifactId>mybatis-plus-boot-starter</artifactId>

    <version>3.5.5</version>

    <exclusions>

        <exclusion>

            <groupId>com.mybatis</groupId>

            <artifactId>mybatis-spring</artifactId>

        </exclusion>

    </exclusions>

</dependency>

2.7 JWT问题修改

使用JWT生成TOKEN时发生错误 --javax.xml.bind.DatatypeConverter

JAVA使用JWT最新库jjwt-api生成JWT(JDK17)-CSDN博客

更新jwt及对应代码

2.8 Swagger问题修改

Type javax.servlet.http.HttpServletRequest not present

由于在SpringBoot3版本中将javax.servlet.http.HttpServletRequest更换为jakarta.servlet.http.HttpServletRequest,如果我们项目中已经将所有的javax包改成了jakarta,并且项目中使用了Swagger,那么应该是Swagger版本问题,SpringBoot3中需要将springfox替换为springdoc。推荐Swagger换成knife4j

项目升级SpringBoot3:java.lang.ClassNotFoundException: javax.servlet.http.HttpServletRequest_java.lang.classnotfoundexception: javax.servlet.se-CSDN博客

2.9 Redis问题

setObjectMapper报错

去除,改为RedisSerializer.json()
redisTemplate改成一个参数
    serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()))

RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)

https://blog.csdn.net/cygqtt/article/details/134557096

2.10 编译问题 无效的—release

使用idea右边的maven界面,清除clean之后再编译compile,报无效的—release

在idea的terminal中直接执行mvn compile可挠过这个问题。可能是idea编译命令问题。

2.11 (ElasticsearchRepository)productRepository.deleteAll不存在

Spring-data-version 由3.2.4改回原来的2.7.5

2.12 无法访问org.springframework.data.repository.ListCrudRepository,无法访问org.springframework.data.repository.ListPagingAndSortingRepository For mongodb

查看原来的代码使用的版本,改回原版本

     3.4.5

<dependency>

    <groupId>org.springframework.data</groupId>

    <artifactId>spring-data-mongodb</artifactId>

    <version>${spring-data-mongodb.version}</version>

</dependency>

2.13 Public Key Retrieval is not allowed

mysql8.0 报错Public Key Retrieval is not allowed_com.mysql.cj.exceptions.unabletoconnectexception: -CSDN博客

    1. 访问/doc.html白页

http://localhost:8080/doc.html#/home 白页,没有显示对应接口

修改url白名单,由于swagger换成了knife4j, url白名单需要相应修改

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Java项目切换到1.8版本,你需要进行以下步骤: 1. 首先,你需要下载并安装适用于你的操作系统的Java Development Kit (JDK) 1.8版本。你可以从Oracle官网下载对应版本的JDK。 2. 安装完成后,打开控制面板,找到系统设置或高级系统设置。 3. 在系统设置中,找到环境变量选项。在系统变量中,添加一个新的变量名为JAVA_HOME,并将其值设置为JDK 1.8的安装路径。 4. 在系统变量的Path变量中,添加%JAVA_HOME%\bin。这将确保系统可以找到JDK 1.8的可执行文件。 5. 如果你的项目中使用了classpath,你需要将其更新为新的JDK路径。在系统变量中,添加一个新的变量名为CLASSPATH,并将其值设置为.;%JAVA_HOME%\lib。 6. 打开命令提示符,输入java -version命令,确认Java版本已经切换到1.8。 请注意,如果你的项目中使用了特定的IDE或构建工具,你可能还需要在其设置中更新Java版本。具体的步骤可能因使用的工具而有所不同,你可以参考相关文档或官方网站以获取更详细的指导。 #### 引用[.reference_title] - *1* *2* [Java版本切换 1.8 1.6切换](https://blog.csdn.net/u011809374/article/details/84826580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JAVA JDK1.8超详细安装教程](https://blog.csdn.net/weixin_56105534/article/details/122054195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值