Java中Controller方法不能直接用@Validated校验基本类型,必须封装为DTO并添加字段注解,配合@Validated触发校验;@RequestBody最标准,@RequestParam/@PathVariable需转DTO;还需引入依赖、全局异常处理和可选分组校验。

Java 中 Controller 方法入参不能直接用 @Validated 校验单个基本类型或简单包装类(如 String、Integer、Long),因为 JSR-303/380 规范只支持对 Java Bean 类型(即含 getter/setter 的对象)进行字段级注解校验。真正可行的方式是“包装 + 声明式注解”,配合 Spring Boot 的自动校验机制完成。
必须用 DTO 封装参数
所有需要校验的请求参数,无论来自 @RequestBody、@RequestParam 还是 @PathVariable,都应先封装进一个独立的 DTO 类,并在字段上添加校验注解:
-
@NotBlank、@NotNull、@Size、@Min/@Max、@Pattern等用于字段约束 - DTO 类建议使用 Lombok 的
@Data或手动提供 getter/setter - Controller 方法参数前加
@Validated(或@Valid),Spring 会自动触发校验
@RequestBody 场景最常用也最标准
JSON 请求体天然适合封装为对象,这是最推荐、最无歧义的用法:
- 前端传
{"mobile":"13812345678","password":"123456"} - 后端定义
LoginDTO,字段标注@NotBlank、@Pattern等 - Controller 写法:
public Result login(@RequestBody @Validated LoginDTO dto) - 校验失败时抛
MethodArgumentNotValidException
@RequestParam / @PathVariable 需要额外注意
它们本质仍是“平铺参数”,不能直接加 @Validated,但可通过两种方式处理:
立即学习“Java免费学习笔记(深入)”;
- 统一转成 DTO:例如把多个
@RequestParam提取为UserQuery,用@ModelAttribute绑定(Spring 会自动从请求参数映射) - 不推荐手动校验:比如在方法里写
if (name == null) throw new IllegalArgumentException(),破坏声明式风格且易遗漏 - 方法级校验(高级用法):启用
@EnableMethodValidation+MethodValidationPostProcessor,再对 Controller 方法本身加@Validated,但适用面窄、配置重,一般项目无需引入
配套必须做好的三件事
光加注解不够,还需闭环支持:
-
引入依赖:确保
spring-boot-starter-validation在 classpath 中(Spring Boot 2.3+ 已默认包含) -
全局异常处理:用
@RestControllerAdvice捕获MethodArgumentNotValidException,提取FieldError并返回前端友好的错误信息(如{"code":400,"msg":"手机号格式不正确"}) -
分组校验(可选但实用):当同一 DTO 用于新增和修改,字段约束不同时,可用接口分组(如
Create、Update)配合@Validated({Create.class})精准控制


















