我在看@org.hibernate.validator.constaints.NotEmpty注释:
@org.hibernate.validator.constaints.NotEmpty
@Documented @Constraint(validatedBy = { }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @ReportAsSingleViolation @NotNull @Size(min = 1) public @interface NotEmpty { String message() default "{org.hibernate.validator.constraints.NotEmpty.message}"; Class<?>[] groups() default { }; Class<? extends Payload>[] payload() default { }; /** * Defines several {@code @NotEmpty} annotations on the same element. */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented public @interface List { NotEmpty[] value(); } }
我对最后一部分感到困惑:
/** * Defines several {@code @NotEmpty} annotations on the same element. */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented public @interface List { NotEmpty[] value(); }
我不确定它是如何工作的,也不知道如何使用它。据我了解,Java 8下的任何内容都不允许在同一元素上重复注释。
有人可以澄清吗?
之所以存在NotEmpty.List,是为了避免无法对同一元素重复相同的注释。借助于NotEmpty.List,可以将多个NotEmpty批注有效地应用于一个元素。注释处理通过NotEmpty注释列表(即NotEmpty.List的值)进行检查。
对于NotEmpty,使用验证者列表的一个原因可能是使用组并为每个组分配不同的消息。
为了举例说明,让我们以可以代表公司或个人的实体为例。在两种情况下,名称都不应为null,但消息有所不同:
@NotEmpty.List({ @NotEmpty( message = "Person name should not be empty", groups=PersonValidations.class), @NotEmpty( message = "Company name should not be empty", groups=CompanyValidations.class), }) private String name;