2012-01-16 3 views
0

В моем собственном валидаторе уровня перед проверкой значения, которое я хочу знать, другие валидаторы отмечают его как действительный или нет?JSR303: Как проверить, что поле уже отмечено как недействительное?

Например, перед проверкой того, что страна существует в базе данных, мне нужно убедиться, что она проходит другие тесты, такие как допустимая длина и шаблон соответствия.

Как это сделать?


Для того, чтобы выяснить, что я действительно хочет, это реальный пример:

@ValidCredentials(groups = AuthAccountForm.FormChecks.class) 
public class AuthAccountForm { 

    @NotEmpty(groups = Login1Checks.class) 
    @Size.List({ 
     @Size(min = LOGIN_MIN_LENGTH, message = "{value.too-short}", groups = Login2Checks.class), 
     @Size(max = LOGIN_MAX_LENGTH, message = "{value.too-long}", groups = Login2Checks.class) 
    }) 
    @Pattern(regexp = LOGIN_REGEXP, message = "{login.invalid}", groups = Login3Checks.class) 
    private String login; 

    @NotEmpty(groups = Password1Checks.class) 
    @Size(min = PASSWORD_MIN_LENGTH, message = "{value.too-short}", groups = Password2Checks.class) 
    @Pattern(
     regexp = PASSWORD_REGEXP, 
     message = "{password.invalid}", 
     groups = Password3Checks.class 
    ) 
    private String password; 

    @GroupSequence({ Login1Checks.class, Login2Checks.class, Login3Checks.class }) 
    public interface LoginChecks { } 

    public interface Login1Checks { } 
    public interface Login2Checks { } 
    public interface Login3Checks { } 

    @GroupSequence({ Password1Checks.class, Password2Checks.class, Password3Checks.class }) 
    public interface PasswordChecks { } 

    public interface Password1Checks { } 
    public interface Password2Checks { } 
    public interface Password3Checks { } 

    public interface FormChecks { } 

} 

И в контроллере:

@RequestMapping(method = RequestMethod.POST) 
public String processInput(
     @Validated({ 
      LoginChecks.class, 
      PasswordChecks.class, 
      FormChecks.class 
     }) final AuthAccountForm form, 
     final BindingResult result) { 

Таким образом, теперь в ValidCredentialsValidator перед тем проверки пароля и входа в систему, Мне нужно убедиться, что они действительны.

ответ

0

Я думаю, вы должны использовать группы и последовательность групп. В последовательности групп, если по крайней мере одно ограничение не выполняется, ограничения следующих групп в последовательности проверяются. Дополнительная информация доступна here.

Например:

@GroupSequence({ Person.class, Group1.class, Group2.class }) 
class Person { 
    @Size(min=4, groups=Group1.class) 
    @Pattern("[a-z]+", groups=Group1.class) 
    @CheckExistence(groups=Group2.class) 
    String country; 
} 

В этом примере, если мы утверждаем группу по умолчанию, ограничение, относящееся к лицу, будет подтверждены первым, то ограничения Group1 и ограничения группа_2. Если одно ограничение Group1 отменяется, Group2 не проверяется.

+0

Мне очень жаль, что я не разместил реальный код. (См. Обновленный вопрос.) Я уже использовал 'groups' с' @ GroupSequence', и мне нужно проверить, проверяет ли он на других групповых проходах. –

+0

Привет, без проблем! Я думаю, что в вашей аннотации @Validated вам необходимо передать групповую последовательность, которая определяет порядок между LoginChecks.class, PasswordChecks.class и FormChecks.class. Обычно с алгоритмом BV, определенным для групповой последовательности, ValidCredentialsValidator будет вызываться только в том случае, если пароль и логин действительны. – kevinpollet

Смежные вопросы