У Spring MVC існують 3 різні способи перевірки: використання анотації, вручну або суміш обох. Існує не унікальний "найчистіший і найкращий спосіб" для перевірки, але, мабуть, той, який краще відповідає вашому проекту / проблемі / контексту.
Давайте мати користувача:
public class User {
private String name;
...
}
Спосіб 1. Якщо у вас є Spring 3.x + та проста перевірка, використовуйте javax.validation.constraints
примітки (також відомі як анотації JSR-303).
public class User {
@NotNull
private String name;
...
}
Вам знадобиться постачальник JSR-303 у ваших бібліотеках, як, наприклад, Hibernate Validator який є еталонною реалізацією (ця бібліотека не має нічого спільного з базами даних і реляційним відображенням, вона просто перевіряє :-).
Тоді у вашому контролері ви матимете щось на кшталт:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Зверніть увагу на @Valid: якщо у користувача є нулеве ім'я, результат.hasErrors () буде істинним.
Спосіб 2: Якщо у вас є складна перевірка (наприклад, логіка великого бізнесу, умовна перевірка в декількох полях тощо), або ви чомусь не можете використовувати метод 1, використовуйте перевірку вручну. Це відома практика відокремлення коду контролера від логіки перевірки. Не створюйте свої класи перевірки з нуля, Spring надає зручний org.springframework.validation.Validator
інтерфейс (починаючи з весни 2).
Тож скажімо, у вас є
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
і ви хочете зробити «складну» перевірку на кшталт: якщо вік користувача до 18 років, відповідальний Користувач не повинен бути недійсним, а відповідальний Вік користувача повинен бути старше 21 року.
Ви зробите щось подібне
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
Тоді у вашому контролері ви мали б:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Якщо є помилки перевірки, результат.hasErrors () буде істинним.
Примітка. Ви також можете встановити валідатор у методі контролера @InitBinder, використовуючи "binder.setValidator (...)" (у цьому випадку використання методів 1 і 2 неможливо, тому що ви замінюєте за замовчуванням валідатор). Або ви можете створити його в конструкторі за замовчуванням контролера. Або мати @ Component / @ Service UserValidator, який ви вводите (@Autowired) у свій контролер: дуже корисно, тому що більшість валідаторів є одинаковими + тестування блоку стає легше + ваш валідатор може викликати інші компоненти Spring.
Спосіб 3:
Чому б не використовувати комбінацію обох методів? Провіряйте прості речі, наприклад атрибут "name", з анотаціями (це швидко зробити, стисло і читати). Зберігайте валідні валідації для валідаторів (коли для кодування спеціальних приміток для підтвердження складних анотацій потрібно буде витратити години або просто тоді, коли використання анотацій неможливо). Я робив це на колишньому проекті, він працював як шарм, швидко і легко.
Попередження: ви не повинні помилитися з обробкою валідацією для обробки виключень . Прочитайте цю публікацію, щоб знати, коли ними користуватися.
Список літератури: