В 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: если пользователь имеет нулевое имя, result.hasErrors () будет true.
Метод 2: Если у вас сложная проверка (например, логика проверки крупного бизнеса, условная проверка в нескольких полях и т. Д.) Или по какой-то причине вы не можете использовать метод 1, используйте ручную проверку. Хорошей практикой является отделение кода контроллера от логики проверки. Не создавайте свой класс (ы) валидации с нуля, Spring предоставляет удобный org.springframework.validation.Validator
интерфейс (начиная с Spring 2).
Так скажем, у вас есть
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
и вы хотите выполнить некоторую «сложную» проверку, например: если возраст пользователя не достиг 18 лет, значение параметраiableUser не должно быть равным нулю, а возраст пункта ответственного пользователя должен быть более 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
}
}
Если есть ошибки проверки, result.hasErrors () будет true.
Примечание. Вы также можете установить валидатор в методе @InitBinder контроллера с помощью «binder.setValidator (...)» (в этом случае смешанное использование методов 1 и 2 будет невозможно, поскольку вы заменяете значение по умолчанию). валидатор). Или вы можете создать его в конструкторе контроллера по умолчанию. Или имейте @ Component / @ Service UserValidator, который вы вводите (@Autowired) в свой контроллер: очень полезно, потому что большинство валидаторов являются одиночными + пересмешивание модульного теста становится проще + ваш валидатор может вызывать другие компоненты Spring.
Метод 3:
Почему бы не использовать комбинацию обоих методов? Проверяйте простые вещи, такие как атрибут «имя», с помощью аннотаций (это быстро, сжато и более читабельно). Сохраняйте тяжелые проверки для валидаторов (когда для написания пользовательских сложных аннотаций валидации потребуются часы или просто когда невозможно использовать аннотации). Я сделал это на предыдущем проекте, он работал как шарм, быстро и легко.
Внимание: вы не должны ошибка обработки проверки для обработки исключений . Прочтите этот пост, чтобы узнать, когда их использовать.
Ссылки :