Объединить валидатор Spring и валидатор Hibernate
В этой статье мы покажем вам, как проверять отправленные значения формы с помощью Spring validator и Hibernate Validator (bean validation).
Используемые технологии:
-
Весна 4.1.6. ВЫПУСК
-
Hibernate Validator 5.1.3.Final
1. Спящий Валидатор
Валидатор Hibernate будет запущен, если указан@Valid.
import org.hibernate.validator.constraints.NotEmpty;
public class User {
@NotEmpty
String name;
//...
}
@RequestMapping(value = "/users", method = RequestMethod.POST)
public String saveOrUpdateUser(
@ModelAttribute("userForm") @Valid User user,
BindingResult result, Model model) {
if (result.hasErrors()) {
//...
} else {
//...
}
}
2. Spring Validator
Если вы включили валидатор Spring через@InitBinder, проверка bean-компонента Hibernate будет проигнорирована.
public class UserFormValidator 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;
//validate something else
}
}
@Controller
public class UserController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UserFormValidator());
}
3. Валидатор гибернации + пружинный валидатор
Иметь как Hibernate, так и Spring валидатор. Удалите@InitBinder и запустите валидатор Spring вручную.
@Controller
public class UserController {
/*@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.setValidator(new UserFormValidator());
}*/
@RequestMapping(value = "/users", method = RequestMethod.POST)
public String saveOrUpdateUser(
@ModelAttribute("userForm") @Valid User user,
BindingResult result, Model model) {
//run Spring validator manually
new UserFormValidator().validate(user, result);
if (result.hasErrors()) {
//...
} else {
//...
}
}
В приведенном выше примере представленная модель «userForm» сначала проверяется валидатором Hibernate, а затем валидатором Spring.