2016-07-05 7 views
0

У меня есть список объектов, которые я должен выполнить некоторые проверки наConstraintValidation не получает прикладывается к списку

@KeyValid 
    @Valid 
    protected List<KeyValue> keyValues; 

и у меня есть следующая аннотация, созданная для него:

@Target({ElementType.TYPE, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = KeyValidator.class) 
public @interface KeyValid{ 

    String message() default "invalid_parameter_default_message"; 

    String[] checks() default {}; 

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

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

И это является моим валидатором:

public class KeyValidator implements ConstraintValidator<KeyValid, KeyValue> { 

    @Override 
    public void initialize(KeyValid keyValid) { 

    } 

    @Override 
    public boolean isValid(KeyValue keyValue, ConstraintValidatorContext constraintValidatorContext) {  

     return true; 
    } 
} 

Я где-то читал, что коллекции могут быть проверены навалом, если список или карта или установить помечается с помощью пользовательских ограничений, то все элементы коллекции называют валидатор, но приведенный выше код выдает следующее сообщение об ошибке

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'com.util.Validators.KeyValid' validating type 'java.util.List<com.model.KeyValue>'. Check configuration for 'keyValue' 

ответ

0

Ваше ограничение будет получить фактический список не прошли его элементы. Если вы используете Java 8 и последнюю версию Hibernate Validator, вы можете использовать type argument constraints. Вам просто нужно обязательно добавить ElementType.TYPE_USE в @Target в ваше ограничение. Ограничения аргументов типа еще не являются официальной частью проверки Bean, но будут в следующей версии (BV 2.0).

Вы бы что-то вроде этого:

protected List<@KeyValid KeyValue> keyValues;

В качестве альтернативы, вы не могли бы поставить @KeyValid ограничение как ограничение уровня класса на KeyValue?

+0

К сожалению, я застрял на Java 7, но я прочитал об аннотациях по объявлению параметра. Выглядит неплохо. Но есть ли способ сделать что-то с Java 7, а также не могу добавить аннотацию к классу напрямую, потому что это сгенерированный источник. –

+1

Вы можете использовать API-интерфейс Hibernate Validator для описания программных ограничений, чтобы добавить ограничение к определению класса KeyValue. Таким образом, вам не нужно прикасаться к исходному коду и просто проверять список через '@ Valid'. – Gunnar