SELECT DISTINCT status FROM orders; grep -rn 'PAID,SHIPPED,DONE' --include=*.java src/main/java
订单状态新增 REFUNDING,前端提交退款单时后端回 400,错误是 status 不在允许的值内,日志里白名单还是 PAID、SHIPPED、DONE 三个值。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,校验用的是手写白名单,不是枚举本身,新增枚举值只改了一半。白名单写在常量类里,没有跟着枚举走,也不会有编译提醒。调用方拿到 400 只能回滚,问题要等有人提交到新状态才暴露。
「枚举白名单校验」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:把白名单换成枚举遍历 用 values() 生成合法集合;或者 DTO 字段直接用枚举类型 让反序列化负责合法性;加一条单测 遍历所有枚举值断言都能通过校验;提交一笔 REFUNDING 订单确认返回 200。
改完只确认一件事:白名单里能看到 REFUNDING 同一笔退款单提交返回 200 数据库状态写入成功。
