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バリデーターが検証されます。