SpringバリデータとHibernateバリデータを組み合わせる
この記事では、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バリデータによって検証されます。