JSR-303 Bean验证集合值

时间:2015-01-08 10:35:32

标签: bean-validation hibernate-validator

我正在尝试使用带有Hibernate Validator的JSR-303 Bean Validation来确保集合不包含空值。

我知道我可以按如下方式注释我的收藏:

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

这确保了集合本身不为null或为空的工作,并且在我添加非null的EmailAddress元素的情况下,它也正确地验证了这一点。但是,并不会阻止添加空元素

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

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 {};
}