订单状态枚举新加了 REFUNDING = 6,新服务写进去后,没升级的老服务查详情返回「未知状态」,前端整页显示空白。老服务日志里 status 打印出来是 6,代码里的 switch 只写到 5。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
OrderStatus s = OrderStatus.forNumber(status);
if (s == null) {
log.warn("unknown status {}", status);
return OrderStatus.STATUS_UNSPECIFIED;
}
proto3 的枚举在线上就是个 int32,收到未定义的数值不会报错,会原样保留。只有生成代码里显式判断 UNRECOGNIZED 才会抛异常,多数 switch 没有 default,直接落空。这一点先确认清楚,后面就不用反复试。
「Proto3 枚举未知值」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,所有 switch 补 default 分支 按未知值处理 别让它穿透;老服务升级前先把枚举转发成字符串 不做业务判断;新值上线分两步 先发读端 再发写端;回归时手工构造一条 status=6 的记录 看老服务返回什么。
改完照着核一遍,构造 status=6 的旧数据 老服务返回未定义状态而不是抛空指针 前端有兜底文案。
