この記事では、SpringバリデータとHibernate Validator(Bean検証)を使用して、送信されたフォームの値を検証する方法を説明します。
使用される技術:
-
Spring 4.1.6.RELEASE
-
Hibernate Validator 5.1.3.Final
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バリデータを有効にした場合、Hibernate Beanの検証は無視されます。
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バリデータによって検証されます。