Spring: один и тот же объект, другая проверка - PullRequest
5 голосов
/ 18 марта 2010

У меня есть объект под названием Пользователь, где я сохраняю все данные Пользователя. У меня есть несколько аннотаций для проверки, и все работает нормально.

public class User{
    @NotEmpty
    @Email
    @Size(max=100)
    @Column(name="username", length=100, nullable=false, unique=true)
    private String username;

    @NotEmpty
    @Size(min=5, max=40)
    @Column(name="password", length=40, nullable=false)
    private String password;

    @Size(min=5, max=40)
    @Transient
    private String newPassword;

    // other attributes ,getters and setters
 }

У меня есть две разные формы (каждая на своей странице). В первом я спрашиваю имя пользователя и пароль для создания пользователя, поэтому оба они являются обязательными.

Во второй форме я показываю информацию о пользователе: имя пользователя, другие данные (которые также будут проверены), а также пароль и новый пароль. Если установлен новый пароль и пароль такой же, как у пользователя, я поменяю пароль пользователя, но если они оставлены пустыми, это означает, что я не должен менять пароль.

Проблема в том, что у меня есть две формы, относящиеся к одному и тому же объекту, где существует разная проверка для пароля поля. В первом он должен быть не пустым, но во втором он может быть пустым.

В контроллере я проверяю объект следующим образом:

public String getUserDetails(@Valid @ModelAttribute("User") User user, BindingResult result, Model model){
    if(result.hasErrors()){
        //There have been errors
    }
    ...
}

но если пароль пуст, будет ошибка.

Есть ли способ выполнить проверку только в некоторых полях объекта?

Могу ли я, по крайней мере, удалить любую ошибку проверки после проверки?

Какова лучшая практика в этом случае?

Спасибо

Ответы [ 4 ]

4 голосов
/ 01 апреля 2016

Вы можете использовать Группы ограничений JSR-303 для достижения этой цели.

public class User {

    public interface GroupNewUser {};

    @NotEmpty
    private String username;

    @NotEmpty(groups = {GroupNewUser.class});
    private String password;

    // ...
}

Затем в контроллере вместо @Valid используйте аннотацию Spring @Validated, которая позволяет указать группу ограничений для применения.

См. это сообщение в блоге и , это также для получения дополнительной информации.

Существует также этот превосходный пост для использования Spring .

3 голосов
/ 18 марта 2010

Это проблема с декларативной проверкой, это не так просто сделать.

Самое простое решение - удалить аннотации проверки из поля пароля и проверить это поле вручную в контроллере. Класс BindingResult содержит методы, позволяющие явно пометить поля как недействительные.

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

0 голосов
/ 16 мая 2013

вместо использования функции hasErrors () используйте hasFieldErrors (fieldname) и проверяйте только определенные поля, требуемые формой.

0 голосов
/ 18 марта 2010

Несколько указателей. Я не уверен, что они будут полезны, хотя:

Весенние документы говорят, что:

Вы можете вызвать binder.setValidator (Validator) в рамках обратного вызова @InitBinder @ Controller. Это позволяет настроить экземпляр Validator для каждого класса @Controller

javax.validation имеет два интерфейса *Context. Познакомьтесь с ними более подробно, чтобы увидеть, можно ли добиться различной проверки в разных контекстах.

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