news 2026/5/21 8:46:17

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Regiee1项目一:登录功能与版本兼容性踩坑

前言:

工欲善其事,必先利其器。今天最大的感悟是:技术选型的版本组合,比写代码本身更考验工程能力。
而第二大感悟是:你以为你在用 JDK 17,其实 Maven 悄悄帮你换成了 JDK 21。

一、今日目标

完成瑞吉外卖项目的员工登录 + 登录拦截器功能。

目标很简单:能登录、能退出、未登录不能访问后台页面。

二、实际完成进度

模块状态备注
项目环境搭建✅ 完成Maven + Spring Boot 2.7.18 + MyBatis-Plus 3.5.3.1
JDK 版本适配✅ 完成最终稳定在 JDK 17
静态资源配置✅ 完成配置 WebMvcConfig 放行 /backend /front
Employee 实体类✅ 完成含 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$JCImport
does 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 17
MyBatis-Plus 3.4.x与 Spring Boot 2.7.x + JDK 21 存在 BeanDefinition 解析冲突

四、💣 隐藏最深的问题:本地仓库与 JDK 自动切换

这个坑今天真的把我整得够呛,单独拿出来说。

场景还原

阶段配置现象
第一阶段联网 + 不配置本地仓库(Maven 默认使用 IDEA 内置 JDK 17)✅ 项目正常启动,登录功能正常
第二阶段离线 + 配置老师给的本地仓库 + settings.xml❌ 突然出现NoSuchFieldError,Lombok 报错
第三阶段换回联网 + 本地仓库❌ 依然报错,问题“传染”了

🧠 根本原因

Maven 在离线 / 使用本地仓库时,会“降级”查找本机安装的 JDK,而不是继续用 IDEA 内置的 JDK。

具体逻辑:

运行方式Maven 选择 JDK 的策略
联网 + 不指定本地仓库优先使用 IDEA 运行时的 JDK(通常是内置 JDK 17)
离线 / 指定本地仓库自动降级查找JAVA_HOME或 PATH 中的 JDK
本机恰好装了 JDK 21Maven 悄悄切换成 JDK 21 → Lombok 不兼容 → 报错

📌 关键结论

你以为你在用 JDK 17,Maven 却悄悄帮你换成了 JDK 21。
不是因为“本地仓库坏了”,而是因为“本地仓库触发 Maven 重新选择了 JDK”。

🛠️ 两种模式的对比

对比项联网模式(不配本地仓库)离线模式(配本地仓库)
JDK 来源IDEA 内置 JDK 17本机安装的 JDK(可能是 21)
依赖下载每次从中央仓库下载从本地仓库直接读取
网络要求必须联网完全离线可用
稳定性依赖版本由中央仓库决定依赖版本由本地仓库决定
常见陷阱下载慢JDK 版本自动切换,导致兼容性问题

✅ 最终解决方案

  1. 放弃 JDK 21,主动降级到 JDK 17

  2. 显式配置 Maven 使用 JDK 17(在 IDEA 中指定)

  3. 本地仓库继续用,不影响

<properties> <java.version>17</java.version> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties>

📌 Maven 的 JDK 选择优先级(重点)

你以为 IDEA 里选了 JDK 17,Maven 就会乖乖用 JDK 17?
不,Maven 有自己的“小心思”。

当出现以下任一条件时,Maven 会忽略 IDEA 的 JDK 设置

  • ✅ 你在settings.xml中配置了<JAVA_HOME>路径

  • ✅ 你的本地仓库路径在D 盘等非默认位置

  • ✅ Maven 处于离线模式重解析状态

👉Maven 会转而查找:

  1. JAVA_HOME环境变量

  2. PATH中的java命令

  3. 本机安装的最高版本 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 使用的 JDK:Settings → 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目录

解决:自定义WebMvcConfig

@Configuration 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 R<Employee> login(...) { ... } }

3️⃣ 过滤器报 JSON 转换错误

现象无法解析符号 'JSON'

原因:Fastjson 版本不对(2.x 和 1.x API 不同)

解决:改用 Spring Boot 自带的 Jackson

private 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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> </parent> <properties> <java.version>17</java.version> <lombok.version>1.18.30</lombok.version> </properties> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <!-- 其他依赖略 --> </dependencies>

七、核心技术点小结(面试备用)

技术点实现方式
密码加密DigestUtils.md5DigestAsHex()
Session 管理request.getSession().setAttribute()
未登录拦截Filter + AntPathMatcher 匹配白名单
JSON 响应JacksonObjectMapper
Maven JDK 切换机制离网时自动降级到本机 JDK

八、今日金句总结

“你以为你在用 JDK 17,Maven 悄悄帮你换成了 JDK 21。”

“本地仓库不是万能的,它会在你离线时,把本机 JDK 推到前台。”

“JDK 21 可以玩,JDK 17 可以稳定交付。实习生阶段:先稳定,再炫技。”

“一个能跑起来的登录 + 拦截器,比一个跑不起来的‘完整项目’更有说服力。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 8:45:16

避坑指南:BUUCTF九连环题目中Zip伪加密与steghide隐写的双重陷阱解析

BUUCTF九连环赛题深度解析&#xff1a;伪加密与隐写术的攻防艺术 在CTF竞赛的MISC类题目中&#xff0c;"九连环"以其精巧的陷阱设计和多层嵌套的解题路径&#xff0c;成为检验选手综合能力的经典案例。这道题表面看似简单&#xff0c;实则暗藏三个关键陷阱&#xff1…

作者头像 李华
网站建设 2026/5/21 8:44:24

网络安全行业,为什么很多公司都会有薪资倒挂现象?

网络安全行业&#xff0c;为什么很多公司都会有薪资倒挂现象&#xff1f; 今天咱们继续聊一聊网安行业薪资倒挂的问题&#xff0c;这是很多网安牛马都关心的问题。 笔者带过的团队有很多员工都是这样的想法&#xff0c;凭什么新人要比老人工资高? "张总&#xff0c;新…

作者头像 李华
网站建设 2026/5/21 8:43:02

把闲置NAS变成数据中枢:Docker部署MySQL全流程与Python连接实战

把闲置NAS变成数据中枢&#xff1a;Docker部署MySQL全流程与Python连接实战 家里那台吃灰的NAS&#xff0c;除了存电影和备份照片&#xff0c;还能干点更有技术含量的事吗&#xff1f;当然可以&#xff01;今天我们就来彻底激活它的潜力&#xff0c;将它打造成家庭数据处理的&q…

作者头像 李华
网站建设 2026/5/21 8:38:54

OBS多平台直播终极指南:一键同时推流到多个平台的完整教程

OBS多平台直播终极指南&#xff1a;一键同时推流到多个平台的完整教程 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经想过&#xff0c;为什么每次直播都要为不同的平台单独配…

作者头像 李华
网站建设 2026/5/21 8:36:20

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

ABAP 7.40新语法实战&#xff1a;用VALUE和REDUCE五分钟搞定复杂内表统计 在SAP开发领域&#xff0c;数据处理一直是核心任务。传统ABAP代码中冗长的LOOP循环和临时变量声明&#xff0c;常常让简单的统计需求变成几十行的代码迷宫。随着ABAP 7.40版本的发布&#xff0c;VALUE、…

作者头像 李华
网站建设 2026/5/21 8:33:18

5分钟快速上手AMD Ryzen SMU调试工具:完整使用指南与实战教程

5分钟快速上手AMD Ryzen SMU调试工具&#xff1a;完整使用指南与实战教程 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: htt…

作者头像 李华