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 {};
}
我正在尝试将 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 {};
}