@Validated @Valid 用法

核心作用

Controller 层的请求参数校验(@RequestParam、@PathVariable、POJO 对象等)

Service 层的方法入参校验

配置类(@ConfigurationProperties)的属性校验

1. 在 Controller 类上添加 @Validated

javascript 复制代码
@RestController
@Validated // 👈 启用方法参数校验
public class UserController {

    // 校验单个参数
    @GetMapping("/user")
    public String getUser(
        @RequestParam @NotBlank String name,
        @RequestParam @Min(1) Integer age
    ) {
        return "Hello " + name + ", age: " + age;
    }

    // 校验 POJO 对象
    @PostMapping("/user")
    public User createUser(@Valid @RequestBody CreateUserRequest request) {
        return userService.save(request);
    }
}

2. 常用校验注解(需配合 @Validated)

注解 说明 示例
@NotNull 不能为 null @NotNull String email
@NotBlank 字符串非 null 且非空(trim 后长度 > 0) @NotBlank String username
@NotEmpty 集合/数组/字符串非 null 且 size > 0 @NotEmpty List<String> tags
@Min(1) / @Max(100) 数值范围 @Min(0) Integer count
@Email 邮箱格式 @Email String email
@Pattern(regexp = "...") 正则匹配 @Pattern(regexp = "^1[3-9]\\d{9}$") String phone

放在形参上

  1. @Validated 在作用于 @RequestBody 对象时,是作为 @Valid 的增强版存在的。
  2. 它不是用于激活 @RequestParam 这类简单参数的校验(那种情况必须类上加 @Validated),而是用于控制对象校验的行为(尤其是分组)。
用法 是否有效 用途
@Validated 放在 Controller 类上 激活 @RequestParam / @PathVariable 等简单参数的校验
@Validated 放在 @RequestBody 参数上 对 POJO 对象进行校验,支持分组(即使没写分组也合法)
@Validated 放在 @RequestParam String name 无效! 简单参数校验必须依赖类上的 @Validated
javascript 复制代码
public AjaxResult add(@Validated @RequestBody SysDictData dict)
javascript 复制代码
public class SysDictData {
    @NotBlank(message = "字典标签不能为空")
    private String dictLabel;

    @NotNull(message = "字典排序不能为空")
    private Integer dictSort;

    // ...
}

这里注意的是如果不用分组的功能 , @Validated @Valid 作用就是一致的

分组

场景 字段要求
新增用户 id 可为空,usernameemail 必填
修改用户 id 必须存在,usernameemail 可选
重置密码 只需 idnewPassword,其他字段忽略

步骤 1:定义分组接口(空接口即可)

javascript 复制代码
public interface AddGroup {}      // 新增分组
public interface UpdateGroup {}   // 修改分组
public interface PasswordGroup {} // 密码相关分组

步骤 2:在实体类字段上指定所属分组

javascript 复制代码
import javax.validation.constraints.*;

public class User {

    @NotNull(message = "ID不能为空", groups = UpdateGroup.class)
    private Long id;

    @NotBlank(message = "用户名不能为空", groups = {AddGroup.class, UpdateGroup.class})
    private String username;

    @Email(message = "邮箱格式不正确", groups = AddGroup.class)
    private String email;

    @NotBlank(message = "新密码不能为空", groups = PasswordGroup.class)
    private String newPassword;

    // 默认分组(未指定 groups 的字段属于 Default 分组)
    @Size(min = 6, max = 20, message = "密码长度6-20位")
    private String password;
}

步骤 3:在 Controller 中使用 @Validated(分组.class)

javascript 复制代码
@RestController
@Validated // 👈 类上仍建议加(虽非必须,但保持一致性)
public class UserController {

    // 新增:只校验 AddGroup + Default 分组
    @PostMapping("/add")
    public Result add(@Validated(AddGroup.class) @RequestBody User user) {
        return userService.add(user);
    }

    // 修改:校验 UpdateGroup + Default 分组
    @PutMapping("/update")
    public Result update(@Validated(UpdateGroup.class) @RequestBody User user) {
        return userService.update(user);
    }

    // 重置密码:只校验 PasswordGroup + Default
    @PostMapping("/reset-password")
    public Result resetPassword(@Validated(PasswordGroup.class) @RequestBody User user) {
        return userService.resetPassword(user);
    }
}
特性 @Valid @Validated
支持分组 ❌ 不支持 ✅ 支持 @Validated(Group.class)
来源 JSR-303 标准 Spring 扩展
作用位置 字段、参数、返回值 类、方法、参数
简单参数校验 ❌ 不能激活 ✅ 需配合类上注解

捕获校验错误

✅ 触发 SysDictData 对象中所有带有 @NotNull、@NotBlank、@Size 等校验注解的字段的验证

✅ 在校验失败时抛出 MethodArgumentNotValidException

✅ 被 Spring 的异常处理器(如 @ControllerAdvice)正常捕获并处理

相关推荐
2501_9475758014 小时前
计算机毕业设计之jsp开山车行二手车交易系统
java·开发语言·hadoop·python·信息可视化·django·课程设计
骑士雄师14 小时前
java面试题 4:鉴权
java·开发语言
帅次15 小时前
Android 高级工程师面试:Java 基础知识 近1年高频追问 22 题
android·java·面试
蓝胖的四次元口袋15 小时前
Java集合(4)
java·哈希算法
2501_9481069115 小时前
计算机毕业设计之基于jsp教科研信息共享系统
java·开发语言·信息可视化·spark·课程设计
TanYYF15 小时前
spring ai入门教程二
java·人工智能·spring
SeeYa-J16 小时前
Spring IOC(Inversion of Control)
java·spring·rpc
宠友信息16 小时前
多端数据互通场景下Spring Boot仿小红书源码结构设计
数据库·spring boot·redis·缓存·架构
不会c+16 小时前
02-SpringBoot配置文件
java·spring boot·后端
AI 大模型学习不踩坑16 小时前
OpenClaw 完整教程:从安装到使用(官方脚本版)
java·人工智能·神经网络·机器学习·计算机视觉·自然语言处理·openclaw