JSR303: Как проверить, что поле уже помечено как недействительное? - PullRequest
0 голосов
/ 16 января 2012

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

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

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


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

@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 перед проверкой пароля и входа в систему мне нужно убедиться, что они действительны.

1 Ответ

0 голосов
/ 16 января 2012

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

Например:

@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;
}

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

...