Валидатор springmvc jsr303 сосуществует с валидатором Spring WebDataBinder в одном действии - PullRequest
5 голосов
/ 11 января 2012

Поскольку springmvc 3.x теперь поддерживает jsr303 и старый валидатор Spring, я хочу смешать их в моих примерах приложений.Но есть только один метод, разрешенный для указанного контроллера, это предел платформы Spring или стандарт JSR?

Вот мой пример кода.

User.java, обозначает модель домена, использует JSR303 для проверки.

public class User{
    @Size(max = 16, message = "user loginId max-length is 16")
    private String loginId;
    //omit getter and setter
}

UserValidator.java, реализует интерфейс org.springframework.validation.Validator для поддержки проверки пользователя.

public class UserValidator implements Validator {

    private UserService userService;
    public boolean supports(Class<?> clazz) {
        return User.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
            User u = (User) target;

            // loginName check for new user
            if (u.getUserId() == null && !userService.isLoginIdUnique(u.getLoginId(), null)) {
                    errors.rejectValue("loginId", "user.loginId.unique", new Object[] { u.getLoginId() }, null);
            }
    }

    @Autowired
    public void setUserService(UserService userService) {
            this.userService = userService;
    }

}

UserController.java, использует аннотацию InitBinder для внедрения UserValidator в WebDataBinder.

@Controller("jspUserController")
@RequestMapping("/sys/users")
public class UserController {
    private UserValidator userValidator;

    @Autowired
    public void setUserValidator(UserValidator userValidator) {
        this.userValidator = userValidator;
    }

/*@InitBinder("user")
    public void initBinderUser(WebDataBinder binder) {
        binder.setValidator(userValidator);
    }*/

    @RequestMapping(value = "/save")
    public String save(@Valid User user, BindingResult bindingResult, Model model, HttpServletRequest request) {
        if (bindingResult.hasErrors()) {
            return "/sys/user/edit";
        }
        userService.saveUser(user);
        return "redirect:/sys/users/index";
    }
}

Если я раскомментирую @InitBinder("user") в UserController, проверка JSR303 будет отключена.В то время как текущий закомментированный код будет использовать валидатор JSR для проверки.Может кто-нибудь дать мне обходной путь, чтобы смешать их в одном контроллере?

Ответы [ 2 ]

8 голосов
/ 04 июля 2014

Вы можете ДОБАВИТЬ свой валидатор вместо того, чтобы УСТАНОВИТЬ его:

@InitBinder("user")
public void initBinderUser(WebDataBinder binder) {
    binder.addValidators(userValidator);
}

Это выполнит сначала проверки JSR303, а затем ваш пользовательский валидатор.Тогда нет необходимости вызывать валидатор непосредственно в методе сохранения.

6 голосов
/ 12 января 2012

Вы можете использовать свой валидатор напрямую и позволить глобальной функции LocalValidatorFactoryBean (JSR-303) также выполнять свою работу:

    @Controller("jspUserController")
    @RequestMapping("/sys/users")
    public class UserController {
        private UserValidator userValidator;

        @Autowired
        public void setUserValidator(UserValidator userValidator) {
            this.userValidator = userValidator;
        }

        @RequestMapping(value = "/save")
        public String save(@Valid User user, BindingResult bindingResult, Model model, HttpServletRequest request) {
            this.userValidator.validate(user, bindingResult);
            if (bindingResult.hasErrors()) {
                return "/sys/user/edit";
            }
            userService.saveUser(user);
            return "redirect:/sys/users/index";
        }
    }
...