接口文档里 amount 标的是 string,联调时实际返回 19.99 这种数字,前端直接调 amount.toFixed(2),控制台报 TypeError: amount.toFixed is not a function。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,DTO 里 amount 是 BigDecimal,序列化配置把数字写成了 JSON number,文档是手写的没跟着改。金额超过 2 的 53 次方还会丢精度。前端按文档写了字符串处理,运行时类型对不上。
「返回体字段类型」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
curl -s http://127.0.0.1:8080/api/orders/20261113001 | jq '.amount, (.amount|type)' grep -n 'BigDecimal amount' src/main/java/**/OrderVO.java
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
具体做法是,全局把 BigDecimal 序列化成字符串 避免精度和类型漂移;用生成式文档 从代码注解导出字段类型;前端解析时先做类型兼容 不要直接调字符串方法;用一笔大额订单确认返回值和文档一致。
最后用这个标准收尾,amount 返回带引号的字符串 jq 的 type 输出 string 前端不再报 TypeError。
