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

相关推荐
Bang邦19 分钟前
解决 MyBatis 中空字符串与数字比较引发的条件判断错误
java·mybatis·ognl·sql动态查询
Tech Synapse23 分钟前
Java 动态设置 JVM 参数的方法
java·开发语言·jvm
是姜姜啊!25 分钟前
搭建springmvc项目
java·spring·mvc
智慧老师29 分钟前
Spring基础分析04-IoC/DI
java·后端·spring
axihaihai33 分钟前
Spring控制器方法参数未找到的解决方案
java·后端·spring
星夜孤帆34 分钟前
IDEA LeetCode刷题插件
java·leetcode·intellij-idea
宽广1 小时前
java aspose word 模板根据数据导出pdf
java·开发语言·pdf·c#·word
码猩1 小时前
VBA 连续打印多个内容成PDF
java·服务器·pdf
yangfeipancc1 小时前
Tomcat的安装即使用
java·tomcat
m0_748240021 小时前
关于idea-Java-servlet-Tomcat-Web开发中出现404NOT FOUND问题的解决
java·servlet·intellij-idea