SpringバリデータとHibernateバリデータを組み合わせる
この記事では、送信されたフォームの値をSpringバリデーターとHibernateバリデーター(Bean検証)で検証する方法を示します。
使用される技術:
-
春4.1.6。リリース
-
Hibernate Validator 5.1.3。最終
1. Hibernate Validator
@Validが指定されている場合、Hibernateバリデーターが起動されます。
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
@InitBinderを介してSpringバリデーターを有効にした場合、HibernateBean検証は無視されます。
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 Validator + Spring Validator
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バリデーターが検証されます。