当前位置: 首页 > news >正文

若依前后端分离项目升级Java 17踩坑实录:Spring Boot 3.2.5 + MyBatis-Plus 3.5.5完整配置清单

若依前后端分离项目升级Java 17实战指南:从踩坑到完美适配

最近在将公司内部的若依前后端分离项目从Java 8升级到Java 17的过程中,遇到了不少"坑"。作为一个经历过完整升级周期的开发者,我想把这次升级过程中的关键点、遇到的典型问题以及最终验证通过的解决方案分享给大家。这篇文章不是简单的步骤罗列,而是聚焦于那些容易出问题的环节,希望能帮助准备升级的同行少走弯路。

1. 升级前的准备工作

在开始升级之前,有几个关键点需要特别注意。首先,Java 17是一个长期支持(LTS)版本,这意味着它会获得更长时间的支持和维护。但与此同时,从Java 8跨越到Java 17,不仅仅是JDK版本的变更,还涉及到一系列相关框架和库的兼容性问题。

必须检查的关键项

  • 当前项目使用的Spring Boot版本(需要升级到3.x系列)
  • 数据库驱动程序的兼容性(特别是MySQL Connector/J)
  • 各种中间件客户端的支持情况(如Redis、RabbitMQ等)
  • 项目中使用到的第三方库是否有Java 17兼容版本

提示:建议在升级前,先在独立的Git分支上进行所有修改,并确保有完整的回滚方案。

2. 核心依赖版本管理

升级到Java 17后,最关键的调整就是各种依赖的版本管理。以下是我们最终确定的pom.xml关键配置:

<properties> <java.version>17</java.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <spring-boot.version>3.2.5</spring-boot.version> <mybatis.plus.version>3.5.5</mybatis.plus.version> <tomcat.version>10.1.24</tomcat.version> <logback.version>1.4.14</logback.version> <spring-security.version>6.2.3</spring-security.version> <spring-framework.version>6.2.6</spring-framework.version> <mysql-connector-j.version>8.1.0</mysql-connector-j.version> <jakarta.servlet-api.version>6.0.0</jakarta.servlet-api.version> <mybatis-spring.version>3.0.3</mybatis-spring.version> </properties>

关键变更说明

依赖项旧版本新版本变更原因
Servlet APIjavax.servletjakarta.servletJava EE迁移到Jakarta EE
Druiddruid-spring-boot-starterdruid-spring-boot-3-starterSpring Boot 3专用版本
Spring Security5.x6.2.3支持Java 17和Spring Boot 3
MySQL Connector5.x8.1.0支持Java 17新特性

3. 主要问题与解决方案

3.1 Jakarta EE命名空间变更

从Java EE到Jakarta EE的命名空间变更可能是最令人头疼的问题之一。几乎所有javax.的引用都需要改为jakarta.

常见需要修改的包

  • javax.servlet → jakarta.servlet
  • javax.persistence → jakarta.persistence
  • javax.annotation → jakarta.annotation

在ruoyi-common模块中,我们需要修改servlet依赖:

<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>${jakarta.servlet-api.version}</version> </dependency>

3.2 Druid连接池适配问题

Alibaba Druid连接池在Spring Boot 3下有专门的starter包。在ruoyi-framework模块中,我们需要做如下修改:

<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>${druid.version}</version> </dependency>

同时,相关的Java配置类也需要更新import语句:

// 修改前 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder; import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties; // 修改后 import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceBuilder; import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;

3.3 Spring Security 6.x配置变更

Spring Security 6.x对配置方式做了较大调整,特别是Lambda DSL风格的配置。以下是SecurityConfig.java中的关键修改:

@Bean protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { return httpSecurity // CSRF禁用,因为不使用session .csrf(AbstractHttpConfigurer::disable) // 禁用HTTP响应标头 .headers(header -> header .cacheControl(HeadersConfigurer.CacheControlConfig::disable) .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) // 认证失败处理类 .exceptionHandling(exception -> exception .authenticationEntryPoint(unauthorizedHandler)) // 基于token,所以不需要session .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 注解标记允许匿名访问的url .authorizeHttpRequests(requests -> { permitAllUrl.getUrls().forEach(url -> requests.requestMatchers(url).permitAll()); requests.requestMatchers("/login", "/register", "/captchaImage").permitAll() // 静态资源,可匿名访问 .requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll() .requestMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/*/api-docs/**", "/druid/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); }) // 添加Logout filter .logout(logout -> logout .logoutUrl("/logout") .logoutSuccessHandler(logoutSuccessHandler)) // 添加JWT filter .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) // 添加CORS filter .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class) .addFilterBefore(corsFilter, LogoutFilter.class) .build(); }

3.4 MyBatis-Plus兼容性问题

MyBatis-Plus 3.5.5与Spring Boot 3.x的集成需要特别注意版本兼容性。以下是关键配置:

<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency>

4. 其他常见问题与解决方案

4.1 验证码组件适配

若依项目中使用的kaptcha验证码组件也需要进行适配,主要是排除旧的servlet-api依赖:

<dependency> <groupId>pro.fessional</groupId> <artifactId>kaptcha</artifactId> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>jakarta.servlet</groupId> </exclusion> </exclusions> </dependency>

4.2 路径匹配模式变更

Spring Boot 3.x中,路径匹配的模式有变化,需要修改PermitAllUrlProperties中的相关代码:

@Override public void afterPropertiesSet() { RequestMappingHandlerMapping mapping = applicationContext.getBean( "requestMappingHandlerMapping", RequestMappingHandlerMapping.class); Map<RequestMappingInfo, HandlerMethod> map = mapping.getHandlerMethods(); map.keySet().forEach(info -> { HandlerMethod handlerMethod = map.get(info); // 获取方法上边的注解 Anonymous method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Anonymous.class); Optional.ofNullable(method).ifPresent(anonymous -> Objects.requireNonNull(info.getPathPatternsCondition().getPatternValues()) .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); // 获取类上边的注解 Anonymous controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Anonymous.class); Optional.ofNullable(controller).ifPresent(anonymous -> Objects.requireNonNull(info.getPathPatternsCondition().getPatternValues()) .forEach(url -> urls.add(RegExUtils.replaceAll(url, PATTERN, ASTERISK)))); }); }

4.3 日志配置调整

Logback的配置也需要相应更新,确保使用兼容Java 17的版本:

<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency>

5. 测试与验证

完成所有配置修改后,必须进行全面的测试验证。以下是我们建议的测试重点:

  1. 基础功能测试

    • 用户登录/登出
    • 权限验证
    • 基础CRUD操作
  2. 性能测试

    • 数据库连接池性能
    • API响应时间
    • 内存使用情况
  3. 兼容性测试

    • 与前端接口的兼容性
    • 与第三方系统的集成
    • 特殊字符和边界条件处理
  4. 安全测试

    • CSRF防护验证
    • XSS防护验证
    • SQL注入防护

在实际升级过程中,我们发现最耗时的部分不是代码修改,而是各种依赖冲突的排查和解决。建议使用Maven的dependency:tree命令仔细分析依赖关系,确保所有传递依赖也都是兼容Java 17的版本。

http://www.jsqmd.com/news/557344/

相关文章:

  • 经典游戏复活指南:DDrawCompat让老游戏在现代Windows系统重生
  • QtScrcpy终极指南:在电脑上流畅操控Android设备的完整方案
  • Windows安装权限故障的自动化修复方案:AtlasOS系统修复工具深度解析
  • 2026连云港木作楼梯服务商综合实力榜:5家品牌深度横评与选型指南 - 2026年企业推荐榜
  • 2026小商品城跨境支付服务深度解析:小商品城公司、小商品城选择指南 - 优质品牌商家
  • OpenClaw+GLM-4.7-Flash:自动化文档处理系统
  • 模拟电子技术学习难点与突破方法
  • Pimoroni Trackball嵌入式驱动开发指南:RGBW球形输入设备I²C控制
  • OpenClaw隐私方案:nanobot镜像实现本地化数据处理闭环
  • 2026年佛山婚姻财产法律服务深度评估:三家顶尖机构助力资产与情感双重守护 - 2026年企业推荐榜
  • STM32CubeMX配置物联网网关连接水墨江南模型云服务
  • CVPR2025新框架DEIM vs RTDETR:工业级目标检测落地对比测评
  • UVM调试利器:手把手教你用四种内置printer高效打印对象信息(附代码示例)
  • 异步FIFO设计中格雷码与二进制转换的Verilog优化实现
  • 2026西安别墅改造市场洗牌:五家实力服务商深度测评 - 2026年企业推荐榜
  • Video2X实用指南:如何高效利用AI技术提升视频画质
  • 五连杆轮腿机器人运动学避坑指南:为什么你的MATLAB仿真和实物对不上?
  • HMC830锁相环SPI通信协议详解:从时序图到FPGA代码实现
  • TSPR-WEB-LLM-HIC 生产级架构升级方案
  • 河南企业经济纠纷服务商选择指南:2026年专业评测与推荐 - 2026年企业推荐榜
  • 铜钟音乐平台:专注于纯粹听歌体验的免费开源音乐播放器
  • 2026安顺毛坯房装修选购指南:五家专业本地服务商深度解析与决策框架 - 2026年企业推荐榜
  • Dalsa线阵相机采图实战:从FreeRun到编码器触发的保姆级配置流程
  • 从传感器到云端:用ChirpStack+MQTT构建LoRaWAN设备全链路监控(含SpringBoot集成预告)
  • 决策参考:2026年唐山选煤设备实力厂商综合评估与推荐 - 2026年企业推荐榜
  • mPLUG视觉问答嵌入式部署探索:Jetson Orin Nano运行轻量VQA流程
  • 51单片机从入门到精通:硬件设计与软件开发指南
  • 毕业前最后一关:用嘎嘎降AI、比话、率零这3款工具降AI率顺利答辩 - 我要发一区
  • UE5特效与逻辑分离指南:用Niagara做炫酷弹道,用蓝图处理伤害判定
  • 实力甄选:2026年郑州国产喷码机五大品牌深度横评 - 2026年企业推荐榜