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

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

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

使用される技術:

  1. 春4.1.6。リリース

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

Related