在 Spring 应用里,@Validated 与 @Valid 这两个注解各自承担什么职责?它们的校验触发机制和使用场景有何不同?
考察说明
考查对 Bean Validation 与 Spring 校验机制的理解程度,能否区分 JSR 标准注解与 Spring 的增强注解在设计意图上的差异。
回答思路
- 【回答框架 1】@Valid 是 JSR-303/380 标准规范定义的方法参数级注解,作用于方法参数或属性字段,由校验框架在方法调用前执行校验逻辑,不依赖 Spring 容器。
- 【回答框架 2】@Validated 是 Spring 基于标准扩展的自定义注解,它支持分组校验可以按业务场景指定校验组,而 @Valid 本身不直接支持分组,需要通过级联校验或额外分组序列实现类似效果。
- 【回答框架 3】在 Spring MVC 中,@Valid 和 @Validated 都能在 Controller 方法参数上触发自动校验,但 @Validated 还可用于类级别校验,比如校验类内方法的参数或返回值,而 @Valid 通常只能标注在参数或属性上。
- 【回答框架 4】在方法级校验中,@Validated 能配合切面触发方法参数或返回值的校验,适用于 Service 层,而 @Valid 更常见于 Controller 层的请求体校验,两者在链路位置和适用层级上存在差异。
- 【关键点 1】@Valid 是 JSR 标准注解,@Validated 是 Spring 封装增强。
- 【关键点 2】@Validated 支持分组校验,@Valid 不直接支持。
- 【关键点 3】@Validated 可标注在类级别,@Valid 常用于参数或属性。
- 【关键点 4】在 Spring MVC 中两者均可触发校验,但 @Validated 更适合方法级和分组校验。
- 【关键点 5】级联校验(嵌套对象)可通过 @Valid 或 @Validated 实现,但分组需配合 @ConvertGroup。
- 【易错点 1】误认为 @Valid 可以支持分组校验,实际需要额外分组序列或 @Validated 配合。
- 【易错点 2】混淆校验触发时机:@Valid 在 Controller 方法调用前生效,@Validated 在方法级切面中也可能触发。
- 【易错点 3】忽略 @Validated 类级别校验的适用性,在非 Spring 环境中 @Validated 不生效。