批量导入接口收了 500 条明细,只校验了列表不为空,明细里的 amount 全是 null,全部写进表里,第二天对账扫出 500 条金额为空。日志里能对上时间点,这种反而好排。

校验注解加在方法参数的外层集合上,没有进入元素对象内部。DTO 里的 amount 是 BigDecimal,null 能顺利通过序列化和 insert。批量接口常被当成透传,逐条业务校验容易整体漏掉。这一点先确认清楚,后面就不用反复试。

SELECT count(*) FROM import_detail
WHERE batch_id = 20261113001 AND amount IS NULL;
curl -s -X POST http://127.0.0.1:8080/api/import/batch -d @batch_500.json

围绕「批量接口校验」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

处理上按这个顺序:给元素类型补 @Valid 并在 amount 上加 @NotNull 和 @DecimalMin;在 service 层对整批做一次过滤 有失败就整批拒绝并返回行号;需要部分成功时把每条结果单独收集 不要静默跳过;用 500 条含空金额的数据重跑 确认一条都没进库。

结果对不对很好判断,同一批数据返回 400 并列出第几条 amount 为空 import_detail 里该批次记录数为 0。

作者 9823189