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