首页 / 资讯中心 / 文章详情

SpringBoot4 + MyBatis 实战踩坑复盘

SpringBoot4 + MyBatis 实战踩坑复盘 ★ FEATURED ARTICLE
摘要本文完整复盘了校园集市后端注册、登录模块的开发过程从 SpringBoot4 版本适配、Maven Scope 区别、DTO 参数校验、Service 层业务校验、BCrypt 密码加密、自定义异常体系、MyBatis 注解开发、BeanUtils 对象拷贝到 JWT 令牌生成。SpringBoot4 MyBatis 实战踩坑今天独立开发校园集市后端注册、登录模块全程从零踩坑、逐个解决涵盖Maven 依赖适配、JWT 整合、参数校验、密码加密、MyBatis 主键回填、自定义异常、对象拷贝等核心知识点。一、SpringBoot4 版本适配坑最开始的大问题1. 问题描述项目使用 SpringBoot 4.x导入 mybatis-spring-boot-starter 4.0.1 一直爆红、下载失败。2. 原因阿里云镜像滞后同步 4.0.1 小版本导致拉取不到依赖。SpringBoot4 必须搭配对应高版本 starter不能沿用 SpringBoot3、2 的依赖。3. 最终解决方案降级为镜像稳定同步的4.0.0功能完全一致无任何业务影响。dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version4.0.0/version /dependency同时统一采用properties 统一版本管理全局只改一处即可升级依赖规范项目结构。二、Maven Scope 区别runtime 踩坑JWT 依赖一直不明白为什么要写 runtime今天彻底搞懂了compile默认编译、运行都需要runtime编译不需要仅运行、打包需要如 jjwt-impl、mysql 驱动provided编译需要运行容器提供不打进包lombokJWT 的 api 是编译用impl、jackson 是运行实现所以必须 runtime。三、DTO 参数校验规范彻底解决 IDEA 报红错误写法在 Controller 参数上加 NotNull导致 IDEA 误以为需要注入 Bean报红警告且校验不生效。正确规范企业标准校验注解全部写在 DTO 字段上Controller 参数仅加 Valid 开启校验。NotBlank非空、非空格用户名、密码专用Size(min 6)限制密码最少6位简单注解做基础校验复杂业务校验全部放 Service 层。四、Service 层业务校验密码长度、账号重复前端注解校验只能防普通参数业务规则必须写在 Service密码长度不能小于6位查询用户名是否存在存在则抛出注册异常不再用普通 RuntimeException自定义业务异常分类清晰、前端提示精准。五、密码加密BCrypt 企业标准方案痛点明文密码绝对不能入库MD5 不安全、无盐可破解。解决方案使用 SpringSecurity 自带 BCrypt 加密自动随机盐无需手动存盐相同密码多次加密结果不同登录使用 matches() 比对不比对密文字符串// 加密注册 String pwd passwordEncoder.encode(dto.getPassword()); // 比对登录 boolean ok passwordEncoder.matches(明文, 数据库密文);六、自定义异常体系账号已存在 / 账号密码错误今天搭建了项目基础异常架构AccountExistException注册重复AccountOrPwdErrorException登录失败统一异常配合 RestControllerAdvice 全局异常统一拦截Controller 零 try-catch代码极度干净。安全规范登录失败不区分“账号不存在/密码错误”统一提示防止暴力遍历用户名。七、MyBatis 注解开发踩坑1. SQL 多余单引号报错SQL 语句末尾多写一个 编译不报红运行直接报错属于隐形大坑。2. Mapper 参数取值错误Mapper 方法参数是实体取值直接写 #{username}不能写 #{user.username}。3. 自增主键返回通过 Options 实现主键回填无需返回值直接回填到原实体对象Insert(insert into users(username,password,nickname) values(#{username},#{password},#{nickname})) Options(useGeneratedKeys true, keyProperty id) void addUser(User user);八、对象属性拷贝 BeanUtils.copyProperties解决 DTO、Entity 快速转换问题同名属性自动复制目标不存在的字段自动忽略可忽略指定字段密码、id核心口诀copyProperties(源对象, 目标对象)顺序绝对不能颠倒。九、JWT 令牌生成架构搭建适配 SpringBoot4 JDK17使用 jjwt 0.12.6 最新版本摒弃旧版废弃 API统一签发过期时间存储用户ID、用户名载荷统一解析、校验、过期判断为后续登录返回 Token、拦截器鉴权打下基础。登录模块完整时序图下面用 Mermaid 时序图串联登录模块的完整调用链Controller 接收请求、Service 业务校验、BCrypt 密码比对、JWT 生成最终把 Token 返回给前端。流程要点Controller 只负责接收参数和返回结果业务校验、密码比对、Token 生成全部下沉到 Service 层登录失败统一抛出 AccountOrPwdErrorException由全局异常处理器统一提示避免暴露账号是否存在兼顾安全与代码整洁。十、今日项目整体架构总结今日完整搭建Maven 依赖版本统一管理DTO 参数校验 Service 业务双层校验BCrypt 密码加密安全机制自定义异常 全局异常处理器MyBatis 注解 CRUD 主键回填JWT 工具类封装BeanUtils 对象转换规范十一、个人复盘感悟今天解决的全部是新手最容易踩的隐形坑版本适配、依赖scope、校验分层、异常体系、密码安全、MyBatis细节。
阅读完成 · 觉得有帮助?
咨询建站