可以,把 @Valid 理解成:
"在接口入口帮你先检查参数对不对的一个工具。"
你可以把它想象成门口保安。
用户发请求过来时,不是直接进业务逻辑,而是先让 @Valid 检查一下:
-
该填的有没有填
-
格式对不对
-
长度合不合理
-
数值有没有超范围
如果不符合要求,就直接拦下来,告诉前端"你传的参数有问题"。
1. 为什么要用 @Valid
假设你有一个"修改用户信息"的接口,前端传这些数据:
-
用户名不能为空
-
手机号必须是 11 位
-
年龄不能小于 0
如果不用 @Valid,你就得自己在代码里一个个写:
java
if (name == null || name.isEmpty()) ...
if (phone == null || phone.length() != 11) ...
if (age < 0) ...
这样会很乱,而且每个接口都要重复写。
用了 @Valid 之后,你只需要把规则写在参数对象上,框架会自动帮你校验。
2. 它一般怎么用
通常是配合 实体类 / DTO / 请求对象 一起用。
比如:
java
public class UserUpdateDTO {
@NotBlank(message = "用户名不能为空")
private String name;
@Pattern(regexp = "^1\\d{10}$", message = "手机号格式不正确")
private String phone;
@Min(value = 0, message = "年龄不能小于0")
private Integer age;
}
然后在接口参数上加 @Valid:
java
@PostMapping("/update")
public Result updateUser(@RequestBody @Valid UserUpdateDTO dto) {
return Result.success();
}
这时候当前端传错参数时,框架就不会继续往下执行,而是直接报校验错误。
3. 它到底校验了谁
@Valid 本身不是规则。
它更像一个"启动校验"的开关。
真正的规则是这些注解:
-
@NotNull:不能为 null -
@NotBlank:字符串不能为空 -
@Size:长度范围限制 -
@Min / @Max:数字范围限制 -
@Pattern:正则校验格式
所以你可以这样理解:
-
@Valid:开始检查 -
其他校验注解:具体检查规则
4. 一个生活化例子
你去坐高铁:
-
@Valid像检票员,说"把证件拿出来,我检查一下" -
@NotBlank像检查"身份证不能为空" -
@Pattern像检查"身份证格式对不对" -
@Min像检查"年龄是否符合要求"
如果检查没问题,放你进去。
如果有问题,直接拦住。
5. 面试里怎么说
@Valid主要是用来做参数校验的。一般会加在接口参数前面,配合 DTO 上的
@NotBlank、@NotNull、@Pattern这些注解一起使用。这样前端传参不合法时,框架会在进入业务逻辑之前先拦截下来,避免无效数据进入 Service 层。
我觉得它的好处是能减少重复的 if 判断,让代码更规范,也更容易维护。
6. 常见搭配
最常见的是这些:
java
@NotNull
@NotBlank
@Size(min = 1, max = 20)
@Min(0)
@Max(100)
@Pattern(...)
比如:
java
public class LoginDTO {
@NotBlank(message = "手机号不能为空")
private String phone;
@NotBlank(message = "密码不能为空")
private String password;
}
接口里:
java
@PostMapping("/login")
public Result login(@RequestBody @Valid LoginDTO dto) {
...
}
7. @Valid 和 @Validated 有什么区别
@Valid
Java 原生校验注解,常用于对象参数校验。
@Validated
Spring 提供的,功能更强一些,支持分组校验。
一般简单参数校验我接触更多的是
@Valid,如果需要更复杂的分组校验,通常会用
@Validated。
8. 你要注意的一点
很多同学加了 @Valid,却发现不生效,常见原因有:
-
没加在参数前面
-
没有配合
@RequestBody -
没有引入校验依赖
-
没有写具体规则注解,比如只写了
@Valid,但 DTO 上啥规则都没有
因为 @Valid 只是触发校验,不负责定义规则。
9. 最后一句话总结
你就记住这句:
@Valid就是在接口接收参数时,先自动帮你检查参数是否合法,避免错误数据进入业务逻辑。