нет сообщения об ошибке, когда пользовательское ограничение нарушается

У меня есть следующий код для моего настраиваемого ограничения:

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

    String message() default "MinMax constraint has been violated";

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

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

    int min() default 1;

    int max() default 10;
}

И класс Validator:

открытый класс MinMaxValidator реализует ConstraintValidator {

int max;
int min;

@Override
public void initialize(CheckMinMax annotation) {
    max = annotation.max();
    min = annotation.min();

}

@Override
public boolean isValid(Integer value, ConstraintValidatorContext arg1) {
    if (value < min || value > max)
        return false;
    return true;
}

}

теперь, когда я аннотирую свой entitybean своей аннотацией и пытаюсь передать объект, который нарушает мое ограничение, следующим кодом:

validator.validate(obj);

работает, но сообщения об ошибке нет ... Здесь чего-то не хватает? Как мне сделать так, чтобы он выводил сообщение об ошибке по умолчанию «Ограничение MinMax было нарушено»?

Спасибо


person Moonlit    schedule 03.04.2012    source источник


Ответы (2)


Validator.validate() метод не генерирует исключение ConstraintValidationException. Он возвращает Set<ConstraintViolation>, вы несете ответственность за выброс исключения, если есть какие-либо нарушения ограничений.

Типичный образец использования:

Set<ConstraintViolation> cvs = validator.validate(obj);
if(cvs.size() > 0){
  throw new ConstraintViolationException(cvs);
}
person Piotr Kochański    schedule 03.04.2012
comment
привет и спасибо за ваш ответ. для набора требуется параметр типа. Установите ‹ConstraintViolation ‹TypeOfObj›› cvs; Но конструктор ConstraintViolationException его не принимает. (Конструктор ConstraintViolationException (Set ‹ConstraintViolation ‹TypeOfObj››) не определен): / - person Moonlit; 04.04.2012

Я понял, как вы можете распечатать сообщение об ошибке, указанное в аннотации:

Set<ConstraintViolation<TypeOfObj> cvs = validator.validate(obj);
for(ConstraintViolation<TypeOfObj> violation : cvs) 
{
    logger.info(violation.getMessage());
}

ваше здоровье

person Moonlit    schedule 05.04.2012