前端按字段名把错误提示定位到输入框,接口返回的 errors 里键是 productInnerSkuId 和 tenantRefNo,页面上三个输入框一个都没标红,用户只看到顶部一条通用提示。日志里能对上时间点,这种反而好排。

直接把 Bean Validation 的字段路径透出去了,内部模型名和接口字段名不是一套。DTO 里没有写 message,默认消息把属性名拼进了文案。这类信息还会暴露表结构和内部命名。这一点先确认清楚,后面就不用反复试。

curl -s -X POST http://127.0.0.1:8080/api/products -d @missing_sku.json
jq '.errors' resp.json

这次卡住的地方就在「错误信息泄露字段」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:给每个约束补 message 只写用户能看懂的话;把字段路径映射成接口文档里的字段名再返回;全局异常处理里去掉类名和属性路径;用缺字段的请求确认返回的键都是对外字段。

结果对不对很好判断,返回的 errors 键变成 skuId 前端对应输入框能标红。

作者 9823189