我正在尝试使用带有Hibernate Validator的JSR-303 Bean Validation来确保集合不包含空值。
我知道我可以按如下方式注释我的收藏:
@Valid
@NotEmpty
private Set<EmailAddress> emails = new HashSet<>();
这确保了集合本身不为null或为空的工作,并且在我添加非null的EmailAddress元素的情况下,它也正确地验证了这一点。但是,并不会阻止添加空元素。
有没有办法阻止将null元素添加到集合中?在一个理想的世界中,解决方案将是声明性的(就像其余的验证一样),并且不会以编程方式迭代遍历集合,手动进行空检查。
提前致谢!
答案 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 {};
}