IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    同时绑定 spring validator和hibernate validator作为校验

    asuncool@gmail.com(yihaomen)发表于 2015-11-29 21:43:38
    love 0
    一般情况下,配置hibernate validator,  就可以对参数进行一些基本的校验,但有时候,还需要更进一步的校验,自定义的校验,如果用spring mvc 的话,首先想到的是spring validator, 但有个问题,一旦你用了 @InitBinder 这个, hibernate validator 就会被忽略。

    用hibernate 校验的一般方法是在 bean 上注解
    程序代码 程序代码

    import org.hibernate.validator.constraints.NotEmpty;

    public class User {

        @NotEmpty
        String name;
        //...
    }


    在 spring mvc 中一般会这样使用.
    程序代码 程序代码

    @RequestMapping(value = "/users", method = RequestMethod.POST)
        public String saveOrUpdateUser(
            @ModelAttribute("userForm") @Valid User user,
            BindingResult result, Model model) {

            if (result.hasErrors()) {
                //...
            } else {
                //...
            }

        }


    单纯的spring validaor 会这样使用 。
    程序代码 程序代码

    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());
         }


    但如果非得这两种方法都同时使用的时候,怎么办呢,因为一旦用了spring validator 的 @InitBinder , hibernate  validator 会被忽略掉。 那么问题就出在 @InitBinder 身上,所以,我们只需要去掉这一部分就可以了。
    程序代码 程序代码

    @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 {
                //...
            }

        }


    这样两种方法均兼顾到了。


沪ICP备19023445号-2号
友情链接