Appearance
Spring 参数校验与统一返回怎么配合:别让校验失败信息满天飞
参数校验几乎每个项目都有,但很多项目的问题在于:
- 会校验
- 但返回不统一
- 报错信息也不稳定
最后前端体验和后端代码都会变差。
先说结论
参数校验更稳妥的做法通常是:
- Controller 层负责输入校验
- 校验失败统一走全局异常处理
- 返回格式和业务异常保持一致
- 不要让每个接口单独拼错误信息
一、为什么参数校验要尽量前置
因为输入校验本质上是在做:
- 请求入口过滤
不合法的参数越早拦住越好。
如果把很多参数合法性判断放到 Service 深处,最后会出现:
- 逻辑重复
- 错误码混乱
- 同一个问题在不同接口表现不一样
二、常见校验到底分几层
更实用一点的理解是:
- 格式层校验
- 业务层校验
格式层校验包括:
- 非空
- 长度
- 数字范围
- 枚举取值
业务层校验包括:
- 订单状态是否允许操作
- 用户是否有权限
- 资源是否已存在
这两层不要混在一起。
三、统一返回为什么要和校验联动
因为参数校验是用户最常见会遇到的错误之一。
如果这一层输出不稳定,前端会很难统一处理。
更稳妥的目标通常是:
- 参数错误也走统一返回结构
- 前端通过统一业务码处理提示
四、BindingResult 什么时候用,什么时候不用
很多人会纠结这件事。
更实用的判断是:
- 如果只是想统一交给全局处理器,很多场景不一定需要手动接
BindingResult - 如果你想拼装更细的错误信息,或者想继续往下做兼容处理,才更适合显式接收
不要为了“显得会用”而每个接口都硬加。
五、参数校验最容易踩的坑
1. 只校验非空,不校验边界
这会导致很多脏数据仍然进系统。
2. 每个接口手动写一遍校验逻辑
项目越大越容易重复。
3. 校验失败直接抛原始异常给前端
这样既不统一,也不利于前端稳定处理。
4. 把业务规则全塞进注解里
注解更适合做格式层校验,复杂业务规则还是应该留在业务层。
六、一个更实际的设计目标
更成熟一点的项目里,参数校验最好达到:
- 入口就能挡住明显非法请求
- 错误提示统一
- 日志里能看见关键上下文
- 业务层不再反复写格式校验
一句话总结
Spring 参数校验真正重要的,不是“会不会用注解”,而是把:
- 输入边界
- 错误输出
- 业务规则分层
这三件事统一起来。