Spring Boot bean validation: @Valid VS @Validated
近期在做项目的过程中发生2个异常问题:
- 参数有异常,但是Spring validation 既没有抛异常,BindingResult 也没有捕捉到任何错误
- 数据绑定抛出异常了,但是 BindingResult没有捕捉到任何错误
有2个注解 @Validated, @Valid,是不是用错了,两者之间有什么区别?
@Valid: javax.validation.Valid , 是JSR - 303,Java 官方规范和实现
@Validated: org.springframework.validation.annotation.Validated, Spring 框架的实现。
@Valid, 配合 验证注解即可用于基本的字段校验。 如果方法中有 BindingResult 跟在待验证的Bean 对象之后,验证error 会存于BindingResult, 否则抛异常
@Validated 配合 验证注解,用于分步的字段校验。例如新用户注册共4个字段(用户名,密码,邮箱,收件地址)前2个是第一步验证,后2个是第二步验证。通过字段校验注解 e.g @NotNull(groups=FirstStep.class) String name;
@Email(groups=SecondStep.class)String email;
回到开头的2个问题:
- 为什么validation 既没有抛异常,也没有 BindResult error?原因可能比较多,具体到我碰到是这样的:pom 缺少依赖。 这里需要2个依赖,第一个是Validator 接口,Spring boot starter validation 才包含实现。
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2 为什么抛出了符合预期的异常(ConstraintViolationException)但是BindingResult 没有error?
在我的case 里,我给Controller 类级加了@Validated, 给 方法参数 也加了 @Valid 属于重复校验了,后执行的校验覆盖了 前一次的结果。为什么会这么加?那纯粹是 不懂瞎试。
-- 完
参考文章:
- https://www.baeldung.com/spring-valid-vs-validated
- https://stackoverflow.com/questions/66479474/spring-frameworkconstraintviolationexception-still-being-threw-even-though-i-ad
- https://stackoverflow.com/questions/18646121/an-errors-bindingresult-argument-is-expected-to-be-declared-immediately-after-th

浙公网安备 33010602011771号