美文网首页
@Valid和@Validated 除了使用的区别,他们的生效状

@Valid和@Validated 除了使用的区别,他们的生效状

作者: flyjar | 来源:发表于2025-08-26 09:05 被阅读0次

如果不在类上添加 @Validated,仅在方法参数上使用 @Valid(如 public void addUser(@Valid User user)),在某些场景下可以生效,但并非所有场景都能正常工作,具体取决于使用场景:

1. 在 Spring MVC 控制器的方法中

  • 仅用 @Valid 可以生效
    在 Controller 的请求处理方法中(如 @PostMapping 标注的方法),即使类上没有 @Validated,只要参数上添加了 @Valid,Spring MVC 会默认触发对该参数的校验(基于 JSR-303 规范)。
    例如:
    @RestController
    public class UserController {
        // 即使类上没有 @Validated,@Valid 也会生效
        @PostMapping("/users")
        public String addUser(@Valid @RequestBody User user) {
            return "success";
        }
    }
    
    此时如果 User 类的字段上有校验注解(如 @NotNull),校验失败会抛出 MethodArgumentNotValidException

2. 在普通 Spring Bean 的方法中(如 Service 层)

  • 仅用 @Valid 不会生效
    在非 Controller 层的 Bean 中(如 Service 类的方法),如果仅在参数上添加 @Valid 而类上没有 @Validated,Spring 不会触发校验。
    例如:
    @Service
    public class UserService {
        // 仅 @Valid 不会生效,需要类上有 @Validated
        public void addUser(@Valid User user) {
            // ...
        }
    }
    
    这种情况下,必须在类上添加 @Validated@Valid 才会生效:
    @Service
    @Validated // 必须添加,否则 @Valid 不生效
    public class UserService {
        public void addUser(@Valid User user) {
            // ...
        }
    }
    

3. 关于分组校验

  • 如果需要使用分组校验(如 @Validated(AddGroup.class)),必须在类上添加 @Validated,否则分组参数无法被 Spring 识别,校验不会按预期执行。

总结

  • Controller 层:仅用 @Valid 即可触发请求参数校验(Spring MVC 特殊支持)。
  • 非 Controller 层(如 Service):必须在类上添加 @Validated,否则 @Valid 无效。
  • 分组校验:无论哪一层,都必须在类上添加 @Validated 才能生效。

因此,为了统一和确保校验逻辑在所有层级都能正常工作,建议在需要校验的类上显式添加 @Validated,并配合 @Valid 使用。

相关文章

网友评论

      本文标题:@Valid和@Validated 除了使用的区别,他们的生效状

      本文链接:https://www.haomeiwen.com/subject/ukedajtx.html