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

相关推荐
Han.miracle1 小时前
Spring Boot 后端分层开发实战:从 MVC 到三层架构详解
java
invicinble2 小时前
it系统全链路思考
java
steel80882 小时前
SSM与Springboot是什么关系? -----区别与联系
java·spring boot·后端
白云如幻2 小时前
【JDBC】集合、反射和泛型复习
java·开发语言
数据中穿行2 小时前
Java编译与类加载错误全指南
java
未秃头的程序猿2 小时前
深入浅出MySQL事务:从ACID到Spring失效场景,2026最新实战指南
java·后端
程序员Terry2 小时前
还在用 if-else 做兼容?三分钟学会适配器模式,让你的代码更优雅
java·设计模式
佩奇大王2 小时前
P2118 排列字母
java·开发语言·算法
东离与糖宝2 小时前
告别 Python!Java 本地部署 Qwen 3.5 实战,Ollama + Spring Boot 保姆级教程
java·人工智能