Заказ валидатора JSF

У меня проблема с проверкой некоторых компонентов.

По сути, у меня есть форма, в которой интернет-пользователи могут создать новый профиль, и они должны ввести свое имя пользователя.

Я хочу проверить имя пользователя в отношении:

  1. Длина
  2. Шаблон
  3. Если имя пользователя уже существует

Для пункта 3 я написал свой собственный валидатор @UserExists. Проблема в том, что я не хочу запускать этот валидатор, если какой-либо из первых двух валидаторов выйдет из строя.

Я обнаружил, что использование @GroupSequence в моем валидаторе UserExists делает трюк в отношении последовательности, но JSF все равно будет вызывать мой валидатор, если один из других валидаторов сообщит, что ввод недействителен. Могу ли я как-то проверить, не сработал ли уже один из других валидаторов?

Вот свойство, которое я хотел проверить:

@Size(min = 3, max = 20)
@Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*")
@UserExists(message = "User already exists")
private String username;

Пользовательский валидатор имеет следующие атрибуты:

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = UserExistsValidator.class)
@GroupSequence({Size.class, Pattern.class})
public @interface UserExists

person foens    schedule 11.09.2011    source источник


Ответы (1)


Аннотация @GroupSequence предназначена для указания в bean-компоненте, в котором размещены ограничения. В качестве членов должны быть указаны группы проверки, а не отдельные ограничения.

Итак, ваш пример может быть реализован следующим образом:

@GroupSequence({Form.class, ExpensiveChecks.class})
public class Form {

    public interface ExpensiveChecks {}

    @Size(min = 3, max = 20)
    @Pattern(regexp = "[A-Za-z]+[A-Za-z0-9]*")
    @UserExists(message = "User already exists", groups=ExpensiveChecks.class)
    private String username;

}

Таким образом переопределяется групповая последовательность по умолчанию для типа Form. Сначала проверяются ограничения @Size и @Pattern. Только если это удастся, ограничение @UserExists (которое является частью группы ExpensiveChecks) будет подтверждено.

Вы можете узнать больше о последовательностях групп и переопределении последовательностей групп по умолчанию в Hibernate Validator справочное руководство и проверку компонентов спецификация.

person Gunnar    schedule 15.09.2011
comment
Спасибо. Я уже был в справочнике, но явно не читал его достаточно внимательно. - person foens; 16.09.2011