@Validated支持分组校验而@Valid不支持,是二者最关键差异;@Validated通过groups属性实现按场景切换验证规则,@Valid仅用于嵌套对象级联校验,且需与@Validated配合使用。

@Valid 本身不支持分组校验,这是它和 @Validated 最关键的差异之一。如果你需要按业务场景切换验证规则(比如“新增”和“修改”用不同字段约束),必须用 @Validated。
分组校验只能靠 @Validated 实现
@Validated 的 groups 属性是其核心能力,而 @Valid 完全没有这个参数。Spring 会根据你传入的分组类型,只触发该组内标注了对应 groups 的校验注解。
- 定义分组接口(空接口即可):
public interface CreateGroup {}
public interface UpdateGroup {} - 在 DTO 字段上指定分组:
@Null(groups = CreateGroup.class)
@NotNull(groups = UpdateGroup.class)
private Long id; - Controller 中按需启用分组:
@PostMapping("/users")
public Result create(@Validated(CreateGroup.class) @RequestBody UserDto dto) { ... }
@Valid 不参与分组,但可与 @Validated 共存
即使用了 @Validated(CreateGroup.class),嵌套对象仍需 @Valid 才能触发内部校验。分组和嵌套是两个独立维度,不能互相替代。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
public class UserDto {
@Valid // 必须加,否则 AddressDto 不会被校验
private AddressDto address;
} - 此时 AddressDto 中的字段若也标注了 groups,会自动按当前 @Validated 的分组生效。
默认分组 Default.class 的陷阱
@Validated 不带 groups 参数时,默认使用 Default.class。如果 DTO 字段只写了 @NotBlank 没写 groups,它就属于 Default 分组;但如果字段写了 @NotBlank(groups = CreateGroup.class),那它就不在 Default 里。
- 常见错误:接口用了 @Validated,但 DTO 所有字段都指定了非 Default 分组 → 校验“看似失效”,实际是没匹配到任何字段。
- 解决办法:要么统一加 Default.class 到字段,要么接口明确传入对应分组。
简单参数(如 @RequestParam)必须用 @Validated
@Valid 不能用于方法参数上的单个基本类型或包装类型(如 @RequestParam String name)。这类校验必须由 @Validated 支持,且 Controller 类上要加 @Validated 注解开启代理。
- Controller 类顶部加:
@RestController
@RequestMapping("/user")
@Validated // 缺少这行,@RequestParam 校验不生效 - 方法中直接写:
@GetMapping("/get")
public Result get(@RequestParam @Min(1) Long id) { ... }

















