Regiee1项目一:登录功能与版本兼容性踩坑

Regiee1项目一:登录功能与版本兼容性踩坑 前言工欲善其事必先利其器。今天最大的感悟是技术选型的版本组合比写代码本身更考验工程能力。而第二大感悟是你以为你在用 JDK 17其实 Maven 悄悄帮你换成了 JDK 21。一、今日目标完成瑞吉外卖项目的员工登录 登录拦截器功能。目标很简单能登录、能退出、未登录不能访问后台页面。二、实际完成进度模块状态备注项目环境搭建✅ 完成Maven Spring Boot 2.7.18 MyBatis-Plus 3.5.3.1JDK 版本适配✅ 完成最终稳定在 JDK 17静态资源配置✅ 完成配置 WebMvcConfig 放行 /backend /frontEmployee 实体类✅ 完成含 MyBatis-Plus 注解EmployeeMapper/Service✅ 完成BaseMapper IService 通用接口EmployeeController.login✅ 完成登录逻辑 Session 存储LoginCheckFilter✅ 完成未登录拦截 放行白名单EmployeeController.logout✅ 完成清除 Session退出登录界面效果登录页正常访问输入 admin/123456 可进入后台右上角退出按钮可正常退出。三、⛔ 最大的“敌人”JDK 版本与依赖兼容性今天 80% 的时间不是在写业务代码而是解决版本冲突。❌ 问题现象java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImportdoes not have member field com.sun.tools.javac.tree.JCTree qualid 问题根源组件冲突原因Lombok低于 1.18.30 的版本无法识别 JDK 21 的内部结构JDK 21重构了JCTree类移除了qualid字段Spring Boot 2.7.x最高只支持 JDK 17MyBatis-Plus 3.4.x与 Spring Boot 2.7.x JDK 21 存在 BeanDefinition 解析冲突四、 隐藏最深的问题本地仓库与 JDK 自动切换这个坑今天真的把我整得够呛单独拿出来说。场景还原阶段配置现象第一阶段联网 不配置本地仓库Maven 默认使用 IDEA 内置 JDK 17✅ 项目正常启动登录功能正常第二阶段离线 配置老师给的本地仓库 settings.xml❌ 突然出现NoSuchFieldErrorLombok 报错第三阶段换回联网 本地仓库❌ 依然报错问题“传染”了 根本原因Maven 在离线 / 使用本地仓库时会“降级”查找本机安装的 JDK而不是继续用 IDEA 内置的 JDK。具体逻辑运行方式Maven 选择 JDK 的策略联网 不指定本地仓库优先使用 IDEA 运行时的 JDK通常是内置 JDK 17离线 / 指定本地仓库自动降级查找JAVA_HOME或 PATH 中的 JDK本机恰好装了 JDK 21Maven 悄悄切换成 JDK 21 → Lombok 不兼容 → 报错 关键结论你以为你在用 JDK 17Maven 却悄悄帮你换成了 JDK 21。不是因为“本地仓库坏了”而是因为“本地仓库触发 Maven 重新选择了 JDK”。️ 两种模式的对比对比项联网模式不配本地仓库离线模式配本地仓库JDK 来源IDEA 内置 JDK 17本机安装的 JDK可能是 21依赖下载每次从中央仓库下载从本地仓库直接读取网络要求必须联网完全离线可用稳定性依赖版本由中央仓库决定依赖版本由本地仓库决定常见陷阱下载慢JDK 版本自动切换导致兼容性问题✅ 最终解决方案放弃 JDK 21主动降级到 JDK 17显式配置 Maven 使用 JDK 17在 IDEA 中指定本地仓库继续用不影响properties java.version17/java.version maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target /properties Maven 的 JDK 选择优先级重点你以为 IDEA 里选了 JDK 17Maven 就会乖乖用 JDK 17不Maven 有自己的“小心思”。当出现以下任一条件时Maven 会忽略 IDEA 的 JDK 设置✅ 你在settings.xml中配置了JAVA_HOME路径✅ 你的本地仓库路径在D 盘等非默认位置✅ Maven 处于离线模式或重解析状态Maven 会转而查找JAVA_HOME环境变量PATH中的java命令本机安装的最高版本 JDK 今天踩坑的真实原因步骤发生了什么①我之前安装过 JDK 21并且在环境变量里配置了JAVA_HOME②后来离线 使用本地仓库触发了 Maven 的“JDK 重选机制”③Maven 读取JAVA_HOME发现 JDK 21④Maven 自动切换到 JDK 21⑤JDK 21 Lombok 1.18.24版本太低NoSuchFieldError✅ 结论“你可以不用 JDK 21但你不能让 Maven 误以为你还在用它。”今天炸的根本原因环境变量里的 JDK 21 成了 Maven 的“第一选择”。本地仓库不是凶手JDK 21 也不是凶手凶手是 Maven 的优先级规则 我忘了自己配过环境变量。️ 以后怎么避免方案操作方案一推荐把JAVA_HOME改成 JDK 17 的安装路径方案二临时删除/注释环境变量中的 JDK 21 配置方案三在 IDEA 中强制指定 Maven 使用的 JDKSettings → Maven → Runner → JRE → 选 JDK 17 一句面试级总结“Maven 的 JDK 选择优先级高于 IDEA 项目设置尤其当你在环境变量中配置了 JAVA_HOME 时Maven 会无条件信任它。”现在博客已经把“本地仓库 离线 JAVA_HOME Maven 优先级 JDK 21 Lombok 不兼容”这条完整链路讲清楚了。这篇文章发出去含金量远超普通的项目日志。给后来者的建议使用离线本地仓库时务必确认 Maven 实际使用的 JDK 版本不要“相信直觉”。可以在代码中打印System.getProperty(java.version)验证或者在 Maven 命令中添加-version查看五、其他踩坑记录1️⃣ 静态资源配置现象访问http://localhost:8080/backend/index.html返回 404原因Spring Boot 默认不映射/backend和/front目录解决自定义WebMvcConfigConfiguration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/backend/**).addResourceLocations(classpath:/backend/); registry.addResourceHandler(/front/**).addResourceLocations(classpath:/front/); } }2️⃣ 登录接口 404现象前端请求/employee/login后端没有响应原因Controller 缺少RequestMapping(/employee)解决RestController RequestMapping(/employee) // ← 加上这一行 public class EmployeeController { PostMapping(/login) public REmployee login(...) { ... } }3️⃣ 过滤器报 JSON 转换错误现象无法解析符号 JSON原因Fastjson 版本不对2.x 和 1.x API 不同解决改用 Spring Boot 自带的 Jacksonprivate static final ObjectMapper OBJECT_MAPPER new ObjectMapper(); response.getWriter().write(OBJECT_MAPPER.writeValueAsString(R.error(NOTLOGIN)));4️⃣ 过滤器不生效原因缺少ServletComponentScan解决启动类加上注解SpringBootApplication ServletComponentScan // ← 必须有 public class Reggie1Application { public static void main(String[] args) { SpringApplication.run(Reggie1Application.class, args); } }六、最终稳定版本组合parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version /parent properties java.version17/java.version lombok.version1.18.30/lombok.version /properties dependencies dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version${lombok.version}/version /dependency !-- 其他依赖略 -- /dependencies七、核心技术点小结面试备用技术点实现方式密码加密DigestUtils.md5DigestAsHex()Session 管理request.getSession().setAttribute()未登录拦截Filter AntPathMatcher 匹配白名单JSON 响应JacksonObjectMapperMaven JDK 切换机制离网时自动降级到本机 JDK八、今日金句总结“你以为你在用 JDK 17Maven 悄悄帮你换成了 JDK 21。”“本地仓库不是万能的它会在你离线时把本机 JDK 推到前台。”“JDK 21 可以玩JDK 17 可以稳定交付。实习生阶段先稳定再炫技。”“一个能跑起来的登录 拦截器比一个跑不起来的‘完整项目’更有说服力。”