概述|参考

Bean Validation 注解

  • 空和非空检查
    • @NotBlank :只能用于字符串不为 null ,并且字符串 #trim() 以后 length 要大于 0 。
    • @NotEmpty :集合对象的元素不为 0 ,即集合不为空,也可以用于字符串不为 null 。
    • @NotNull :不能为 null 。
    • @Null :必须为 null 。
  • 数值检查
    • @DecimalMax(value) :被注释的元素必须是一个数字,其值必须小于等于指定的最大值。
    • @DecimalMin(value) :被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
    • @Digits(integer, fraction) :被注释的元素必须是一个数字,其值必须在可接受的范围内。
    • @Positive :判断正数。
    • @PositiveOrZero :判断正数或 0 。
    • @Max(value) :该字段的值只能小于或等于该值。
    • @Min(value) :该字段的值只能大于或等于该值。
    • @Negative :判断负数。
    • @NegativeOrZero :判断负数或 0 。
  • Boolean 值检查
    • @AssertFalse :被注释的元素必须为 true 。
    • @AssertTrue :被注释的元素必须为 false 。
  • 长度检查
    • @Size(max, min) :检查该字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等。
  • 日期检查
    • @Future :被注释的元素必须是一个将来的日期。
    • @FutureOrPresent :判断日期是否是将来或现在日期。
    • @Past :检查该字段的日期是在过去。
    • @PastOrPresent :判断日期是否是过去或现在日期。
  • 其它检查
    • @Email :被注释的元素必须是电子邮箱地址。
    • @Pattern(value) :被注释的元素必须符合指定的正则表达式。

Hibernate Validator 附加的约束注解

Hibernate Validator.png

@Valid@Validated

  • @Valid 注解,是 Bean Validation 所定义,可以添加在普通方法、构造方法、方法参数、方法返回、成员变量上,表示它们需要进行约束校验。
  • @Validated 注解,是 Spring Validation 锁定义,可以添加在类、方法参数、普通方法上,表示它们需要进行约束校验。同时,@Validated 有 value 属性,支持分组校验。属性如下:
  1. @Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Validated {
  5. /**
  6. * Specify one or more validation groups to apply to the validation step
  7. * kicked off by this annotation.
  8. * <p>JSR-303 defines validation groups as custom annotations which an application declares
  9. * for the sole purpose of using them as type-safe group arguments, as implemented in
  10. * {@link org.springframework.validation.beanvalidation.SpringValidatorAdapter}.
  11. * <p>Other {@link org.springframework.validation.SmartValidator} implementations may
  12. * support class arguments in other ways as well.
  13. */
  14. Class<?>[] value() default {};
  15. }
  • ① 声明式校验

Spring Validation 仅对 @Validated 注解,实现声明式校验。

  • ② 分组校验

Bean Validation 提供的 @Valid 注解,因为没有分组校验的属性,所以无法提供分组校验。此时,我们只能使用 @Validated 注解。

  • ③ 嵌套校验

相比来说,@Valid 注解的地方,多了【成员变量】。这就导致,如果有嵌套对象的时候,只能使用 @Valid 注解。例如说:

  1. // User.java
  2. public class User {
  3. private String id;
  4. @Valid
  5. private UserProfile profile;
  6. }
  7. // UserProfile.java
  8. public class UserProfile {
  9. @NotBlank
  10. private String nickname;
  11. }

如果不在 User.profile 属性上,添加 @Valid 注解,就会导致 UserProfile.nickname 属性,不会进行校验。