应捕获MethodArgumentNotValidException并从BindingResult中提取fieldErrors,用getField()和getDefaultMessage()获取字段名与国际化提示,组装为含code、message、details的标准JSON响应。

在全局异常处理器中提取参数校验异常的错误信息,关键在于准确识别 MethodArgumentNotValidException,并从其绑定结果中结构化获取字段级提示,而不是简单调用 e.getMessage()。
捕获并识别参数校验异常
在 @ControllerAdvice 类中,用 @ExceptionHandler(MethodArgumentNotValidException.class) 明确拦截该异常。它专用于 @Valid 或 @Validated 触发的 DTO 校验失败场景,与普通业务异常严格区分开。
- 不要用
Exception.class一锅端捕获,否则会丢失校验上下文 - 确保 Controller 入参已正确添加
@Validated(或@Valid)注解,否则异常根本不会抛出
从 BindingResult 提取结构化错误
异常对象中封装了 BindingResult,它是真正存储所有校验失败详情的地方。推荐只取第一个错误字段(兼顾简洁与可读性),也可遍历全部:
- 调用
ex.getBindingResult().getFieldErrors()获取List<fielderror></fielderror> - 对每个
FieldError,用getField()拿字段名(如"email"),getDefaultMessage()拿国际化后的提示(如"邮箱格式不正确") - 避免直接用
getCode()或硬编码拼接,它返回的是注解类名(如"Email"),不是业务语义
结合国际化自动翻译提示
只要配置了 MessageSource 并正确命名资源文件(如 messages_zh_CN.properties),getDefaultMessage() 就会自动根据当前请求的 Locale 返回对应语言的文案:
立即学习“Java免费学习笔记(深入)”;
- 实体字段注解必须使用键名引用,例如
@Email(message = "{user.email.invalid}") - 资源文件中定义
user.email.invalid=邮箱格式不正确,占位符(如{0})会被自动填充 - 无需在异常处理器里手动查
MessageSource,Spring 已完成整合
封装成前端友好的响应结构
提取出字段名和提示后,应统一组装为标准 JSON 格式,例如:
{"code": 400, "message": "参数校验失败", "details": [{"field": "email", "message": "邮箱格式不正确"}]}- 建议封装
buildResponse()方法集中处理状态码、时间戳、traceId 注入等横切逻辑,各 handler 只负责提取核心字段信息 - 不要把错误信息拼进
message主字段,而应放入独立的details数组,方便前端做精准表单高亮


















