Статьи

Spring MVC: ручная проверка Trgger объекта формы

Иногда может быть необходимо использовать ручную проверку в Spring MVC @Controller. Это очень просто с классом Spring org.springframework.validation.ValidationUtils . Узнайте, как вызвать валидатор в двух разных сценариях.

Сценарий 1 — вызвать проверку

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

1
2
3
4
5
6
public class User {
 
    @UserExists
    private String username;
 
}

В классе контроллера у меня есть метод, который обрабатывает метод POST этого объекта:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Autowired
private org.springframework.validation.Validator validator;
 
@RequestMapping(value = "/user", method = RequestMethod.POST)
public String validate(@ModelAttribute User user, Errors errors) {
 
    ValidationUtils.invokeValidator(validator, user, errors);
 
    if (errors.hasErrors()) {
        // error, show errors to the user
    }
 
    // success, form is valid!
}

org.springframework.validation.ValidationUtils — это класс для вызова org.springframework.validation.Validator .

Обратите внимание, что за параметром пользователя следует объект org.springframework.validation.Errors . Spring инициализирует этот объект, но он пуст и может быть передан в метод invokeValidator .

Сценарий 2 — вызвать проверку с подсказками

В этом случае пользовательская форма становится немного сложнее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@GroupSequence(value = {ValidationOrder.First.class, ValidationOrder.Second.class})
interface ValidationOrder {
    interface First {}
    interface Second {}
}
 
 
public class User {
 
    @UserExists(groups = ValidationOrder.First.class)
    @UserIsEntitledToDiscount(groups = ValidationOrder.Second.class)
    private String username;
 
}

Благодаря @GroupSequence я мог определиться с порядком проверки. Чтобы запустить проверку, мне нужно передать дополнительный аргумент в метод invokeValidator чтобы группы использовались правильно:

1
ValidationUtils.invokeValidator(validator, user, errors, ValidationOrder.class);

Исходный код

Исходный код содержит все три подхода, так что вы можете быстро сравнить их: https://github.com/kolorobot/spring-mvc-beanvalidation11-demo