2015-01-08 2 views
0

Я пытаюсь использовать проверку JAR-303 Bean Validation с помощью Hibernate Validator, чтобы гарантировать, что коллекция не содержит нулевых значений.JSR-303 Значения коллекции валидации Bean

Я знаю, что я могу комментировать свою коллекцию следующим образом:

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

Это делает работу для обеспечения того, чтобы сама коллекция не является нулевой или пустой и в том случае, когда я добавить ненулевой EmailAddress элемент он также проверяет это правильно. Однако не препятствует добавлению нулевого элемента.

Есть ли способ предотвратить добавление нулевого элемента в коллекцию? В идеальном мире решение будет декларативным (как и остальная часть проверки) и не будет включать программную итерацию через коллекцию, вручную выполняющую нулевые проверки.

Заранее благодарен!

ответ

2

Проверка бина отсутствует аннотация @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; 
    } 
} 

Как вы можете видеть, что я назвал пользовательский annotaion 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 {}; 
}