JSR-303 Bean 验证 Collection 值

JSR-303 Bean Validation Collection Values

我正在尝试将 JSR-303 Bean 验证与 Hibernate Validator 结合使用,以确保 collection 不包含空值。

我知道我可以注释我的 collection 如下:

@Valid
@NotEmpty
private Set<EmailAddress> emails = new HashSet<>();

这会确保 collection 本身不为 null 或为空,如果我添加 non-null EmailAddress 元素,它也会正确验证这一点。但是,它不会阻止添加空元素

有没有办法防止将空元素添加到 collection?在理想的世界中,解决方案将是声明性的(就像其余的验证一样)并且不会涉及以编程方式迭代 collection 手动执行空检查。

提前致谢!

Bean 验证缺少集合的 @NotBlank 注释,这非常适合您描述的场景。基本上,正如您提到的,您需要实现一个自定义验证器,该验证器将以编程方式检查集合的内容,确保其中的 none 元素为空。

这是您需要的自定义验证器的示例:

public class CollectionNotBlankValidator implements 
    ConstraintValidator<CollectionNotBlank, Collection> {

    @Override
    public void initialize(CollectionNotBlank constraintAnnotation) {

    }

    @Override
    public boolean isValid(Collection value, ConstraintValidatorContext context) {
        Iterator<Object> iter = value.iterator();
        while(iter.hasNext()){
            Object element = iter.next();
            if (element == null)
                return false; 
        }
        return true;
    }
}

如您所见,我已将自定义注释命名为 CollectionNotBlank。以下是自定义注释的代码示例:

@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = CollectionNotBlankValidator.class)
@ReportAsSingleViolation
@Documented
public @interface CollectionNotBlank {

    String message() default "The elements inside the collection cannot be null values.";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}