springboot2升级到springboot3过程相关修改

springboot2升级到springboot3过程相关修改


近期项目被扫描出关于Spring Framework路径遍历漏洞(CVE-2024-38816),客户要求整改,查了下springboot2需要升级到5.3.40才可以,但springboot2好像不太能很快就升级,或者有可能不再会升级了,因此直接就将springboot升级到3了,本想着万年jdk8,但springboot3不支持jdk8,看样子要打破了,因此利用周末做了一下升级测试,记录如下:

以下为我进行springboot2升级到springboot3过程相关修改记录,备查,你的项目不一定用到下面所有的,可以参考着改

主要修改

jdk升级

按springboot3要求,升级到jdk17或jdk21,我这边是升级到jdk17

spring-boot-starter-parent

spring-boot-starter-parent依赖版本升级

升级前

c 复制代码
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.18</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

升级后

c 复制代码
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.4.0</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

jdk源码编码修改,将1.8改成17或21

修改前

c 复制代码
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

修改后

c 复制代码
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>17</source>
					<target>17</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

javax.servlet.*相关的类找不到,需要切换依赖为jakarta.servlet

c 复制代码
		<!--jakarta.servlet start -->
		<dependency>
			<groupId>jakarta.servlet</groupId>
			<artifactId>jakarta.servlet-api</artifactId>
		</dependency>
		<!--jakarta.servlet end -->

同时,将所有javax.servlet.*修改为jakarta.servlet.*

另外校验类相关的也进行修改javax.validation.*修改为jakarta.validation.*

mybatis-plus-boot-starter升级

mybatis-plus-boot-starter需要升级,不升可能会报Invalid value type for attribute 'factoryBeanObjectType': java.lang.String,需要升级一下依赖

升级成:mybatis-plus-spring-boot3-starter,我使用的是3.5.5

c 复制代码
		<!-- mybatis-plus start-->
		<dependency>
		    <groupId>com.baomidou</groupId>
		    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
		    <version>3.5.5</version>
		</dependency>
		<!-- mybatis-plus end-->

redis修改

配置上需要加上data

需要修改redis的配置:由原来的spring.redis.修改为spring.data.redis.

改完后重启又发现如下错误:

Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @2bbaf4f0

原因是redission版本比较低,我升级版本后就没问题了

升级前版本:<redisson.version>3.12.5</redisson.version>

升级后版本:<redisson.version>3.40.2</redisson.version>

swagger升级到springboot3

c 复制代码
<swagger3.version>2.7.0</swagger3.version>
c 复制代码
		<!-- swagger3 start -->
		<dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
      <version>${swagger3.version}</version>
    </dependency>
    <!-- swagger3 end -->

swagger3默认是开启了接口和doc的访问的如引入上面的依赖后,可以通过如下地址访问(假如端口为8080,context-path为/test)

http://localhost:8080/test/swagger-ui/index.html
http://localhost:8080/test/v3/api-docs

注:如果生产环境中需要禁用,使用如下配置进行,分别进行ui的禁用和api-docs的禁用

c 复制代码
springdoc:
  swagger-ui:
    enabled: true
  api-docs:
    enabled: true

其他修改参考

如果用到了阿里巴巴druid数据源,最好升级到新版本

我这里是从druid的1.2.12版本升级到了1.2.24

注:我使用的是编程式的阿里巴巴的监控配置,WebStatFilter和StatViewServlet的实现类需要修改,如果不是用编程式,可以不用管这一步

c 复制代码
import com.alibaba.druid.support.jakarta.WebStatFilter;

import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebInitParam;

//注意不要忘记在 SpringBootSampleApplication.java 上添加 @ServletComponentScan 注解,不然就是404了。
@WebFilter(
		filterName = "druidWebStatFilter", urlPatterns = "/*", 
		initParams = { @WebInitParam(name = "exclusions", value = "weburi.json,.html,.js,.gif,.jpg,.png,.css,.ico,/druid/*") // 忽略资源
})
public class DruidStatFilter extends WebStatFilter {
}
c 复制代码
import com.alibaba.druid.support.jakarta.StatViewServlet;

import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;

//注意不要忘记在 SpringBootSampleApplication.java 上添加 @ServletComponentScan 注解,不然就是404了。
@WebServlet(urlPatterns="/druid/*",  
    initParams={  
         @WebInitParam(name="allow",value=""),// IP白名单(没有配置或者为空,则允许所有访问)  
         @WebInitParam(name="deny",value=""),// IP黑名单 (存在共同时,deny优先于allow)  
         @WebInitParam(name="loginUsername",value="admin"),// 用户名  
         @WebInitParam(name="loginPassword",value="123456"),// 密码  
         @WebInitParam(name="resetEnable",value="true")// 启用HTML页面上的"Reset All"功能  
})  
public class DruidStatViewServlet extends StatViewServlet {  
    private static final long serialVersionUID = -2688872071445249539L;  
}  

LocalVariableTableParameterNameDiscoverer类找不到

springboot3中没有这个类了,需要修改成org.springframework.core.StandardReflectionParameterNameDiscoverer

相关推荐
等一场春雨1 分钟前
Java设计模式 十二 享元模式 (Flyweight Pattern)
java·设计模式·享元模式
努力搬砖的程序媛儿2 小时前
uniapp悬浮可拖拽按钮
java·前端·uni-app
上海拔俗网络2 小时前
“AI开放式目标检测系统:开启智能识别新时代
java·团队开发
Leaf吧2 小时前
springboot 配置多数据源以及动态切换数据源
java·数据库·spring boot·后端
荆州克莱2 小时前
Golang的网络编程安全
spring boot·spring·spring cloud·css3·技术
java1234_小锋2 小时前
Java中如何安全地停止线程?
java·开发语言
栗子~~3 小时前
基于quartz,刷新定时器的cron表达式
java
杨过姑父3 小时前
Servlet3 简单测试
java·servlet
chengxuyuan666663 小时前
python基础语句整理
java·windows·python
一只会飞的猪_3 小时前
国密加密golang加密,java解密
java·开发语言·golang