最近做了从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
- HttpSecurity中antMatchers弃用
处理同2
- 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
发现 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
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
-
- 访问/doc.html白页
http://localhost:8080/doc.html#/home 白页,没有显示对应接口
修改url白名单,由于swagger换成了knife4j, url白名单需要相应修改