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

相关推荐
weixin_4196583115 分钟前
RabbitMQ 的高级特性
java·分布式·rabbitmq
白晨并不是很能熬夜16 分钟前
【RPC】第 1 篇:全景篇 — 一次 RPC 调用的完整旅程
java·网络·后端·网络协议·面试·rpc·java-zookeeper
z小天才b40 分钟前
Java 设计模式完全指南:从入门到精通
java·开发语言·设计模式
烤麻辣烫1 小时前
算法--二分搜索
java·开发语言·学习·算法·intellij-idea
逍遥德1 小时前
MQTT教程详解-03. 高级知识点
java·物联网·中间件·信息与通信·iot·iotdb
Nice__J1 小时前
ISO26262功能安全——SafeOS
java·linux·安全
夹芯饼干1 小时前
虚拟机指令第六节
java·linux·服务器
A_aspectJ2 小时前
【Java基础开发】基于 Java Swing +MySQL + JDBC 版实现图书管理系统
java·开发语言·mysql
TE-茶叶蛋2 小时前
Spring最核心扩展点:BeanPostProcessor
java·后端·spring
Mr.45672 小时前
SpringBoot多模块依赖冲突排查与架构优化实战(避坑指南)
java·spring boot·架构