SpringバリデータとHibernateバリデータを組み合わせる

この記事では、SpringバリデータとHibernate Validator(Bean検証)を使用して、送信されたフォームの値を検証する方法を説明します。

使用される技術:

  1. Spring 4.1.6.RELEASE

  2. 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バリデータによって検証されます。

Related