@Vaild

可以,把 @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 就是在接口接收参数时,先自动帮你检查参数是否合法,避免错误数据进入业务逻辑。

相关推荐
翊谦6 小时前
Java Agent开发 Milvus 向量数据库安装
java·数据库·milvus
晓晓hh6 小时前
JavaSE学习——迭代器
java·开发语言·学习
查古穆6 小时前
栈-有效的括号
java·数据结构·算法
Java面试题总结7 小时前
Spring - Bean 生命周期
java·spring·rpc
硅基诗人7 小时前
每日一道面试题 10:synchronized 与 ReentrantLock 的核心区别及生产环境如何选型?
java
014-code7 小时前
String.intern() 到底干了什么
java·开发语言·面试
摇滚侠7 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
楚国的小隐士8 小时前
为什么说Rust是对自闭症谱系人士友好的编程语言?
java·rust·编程·对比·自闭症·自闭症谱系障碍·神经多样性
春花秋月夏海冬雪8 小时前
代码随想录刷题 - 贪心Part1
java·算法·贪心·代码随想录
野生技术架构师8 小时前
2026年牛客网最新Java面试题总结
java·开发语言