springmvc+jdk1.8升级到springboot3+jdk17(实战)

1.查找springboot3官方要求

这里查的是springboot 3.2.6版本的

2.升级jdk到17

Java EE 8之后,Oracle在19年把javax捐给了eclipse基会,但不允许使用javax的命名空间,所以eclipse才发展成为现在的Jakarta ee标准。Springboot3后使用Jakarta api,要求servlet6.0及以上,javax*的接口都无法使用报红。

所以依赖加入以下包:

复制代码
<dependency>
   <groupId>jakarta.annotation</groupId>
   <artifactId>jakarta.annotation-api</artifactId>
   <version>2.1.1</version>
</dependency>
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.30</version>
</dependency>
<dependency>
   <groupId>jakarta.servlet</groupId>
   <artifactId>jakarta.servlet-api</artifactId>
   <version>6.0.0</version>
</dependency>

代码中:

所有resouce替换成import jakarta.annotation.Resource;

所有PostConstruct替换成import jakarta.annotation.PostConstruct;

所有servlet、filter相关javax的都需要重新导成jakarta下的包。

Base64修改:

BASE64Encoder encoder = new BASE64Encoder();

return encoder.encode(data);

改为:

Base64.Encoder encoder = Base64.getEncoder();

return encoder.encodeToString(data);

3.springboot升级

3.1 版本引入

参考Using the Plugin :: Spring Boot

3.2 相关包升级

之前所有的spring相关包版本升级到对应的6.1.6

groovy-all也需要升级:

复制代码
<dependency>
   <groupId>org.codehaus.groovy</groupId>
   <artifactId>groovy-all</artifactId>
   <version>3.0.7</version>
</dependency>

这里有个坑,大家需要注意,如果你没使用spring的parent,升级到了3.2.5。需要在pom maven-compiler-plugin中加入parameters,否则参数地址都是访问不了。这是因为LocalVariableTableParameterNameDiscoverer已在 6.1 中删除。因此,Spring 框架和 Spring 组合框架中的代码不再尝试通过解析字节码来推断参数名称。如果您遇到依赖项注入、属性绑定、SpEL 表达式或其他依赖于参数名称的用例的问题,则应使用通用 Java 8+ 标志-parameters来保留参数名称来编译 Java 源代码(而不是依赖于-debug编译器)标志)以便与StandardReflectionParameterNameDiscoverer. Groovy 编译器还支持-parameters用于相同目的的标志。对于 Kotlin 编译器,请使用该-java-parameters标志。

复制代码
<plugin>

   <groupId>org.apache.maven.plugins</groupId>

   <artifactId>${maven_compiler_plugin_version}</artifactId>

   <version>3.11.0</version>

   <configuration>

      <parameters>true</parameters>

      <source>17</source>

      <target>17</target>

      <compilerArgs>

         <arg>-Xlint:deprecation</arg>

         <arg>-Xlint:options</arg>

         <arg>-Xlint:path</arg>

         <arg>-Xlint:unchecked</arg>

      </compilerArgs>

      <forceJavacCompilerUse>true</forceJavacCompilerUse>

   </configuration>

</plugin>

3.3 升级后编译问题

HandlerInterceptorAdapter在springboot3中已经移除,所有Interceptor原来继承HandlerInterceptorAdapter,都改为实现HandlerInterceptor接口。

3.4 web.xml转换

springboot没有web.xml配置,需要把web.xml中监听器、过滤器、servlet等转换为springboot configBean形式。

3.5 如果原有工程有循环依赖启用循环依赖

springboot2.6禁用了循环依赖,如果代码工程中有,需要开启,yml配置:

复制代码
spring:
  main:
    #springboot从2.6之后默认禁用了循环依赖,由于项目中有循坏依赖,故开启
    allow-circular-references: true
相关推荐
huangdong_6 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天7 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录9177 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
llz_1127 小时前
web-第四次课后作业
前端·spring boot·web
JAVA面经实录9177 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥8 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码8 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|8 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy8 小时前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试