11

我在看@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 下的任何内容都不允许在同一元素上重复注释。

有人可以澄清吗?

4

1 回答 1

12

NotEmpty.List存在的原因是为了解决不能为同一元素重复相同注释的事实。在 NotEmpty.List 的帮助下,多个NotEmpty注释有效地应用于一个元素。注释处理检查作为 NotEmpty.List 值的 NotEmpty 注释列表。

在 NotEmpty 的情况下,使用验证器列表的一个原因可能是使用并为每个组分配不同的消息。

例如,让我们以可以代表公司或个人的实体为例。在这两种情况下,名称都不应为空,但消息不同:

@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;
于 2014-07-23T12:46:28.583 回答