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