Объединить валидатор Spring и валидатор Hibernate

Объединить валидатор Spring и валидатор Hibernate

В этой статье мы покажем вам, как проверять отправленные значения формы с помощью Spring validator и Hibernate Validator (bean validation).

Используемые технологии:

  1. Весна 4.1.6. ВЫПУСК

  2. Hibernate Validator 5.1.3.Final

1. Спящий Валидатор

Валидатор Hibernate будет запущен, если указан@Valid.

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

Если вы включили валидатор Spring через@InitBinder, проверка bean-компонента Hibernate будет проигнорирована.

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, так и 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