springmvc jsr303 validator co-exist with spring WebDataBinder validator in one action

Поскольку springmvc 3.x теперь поддерживает jsr303 и старый валидатор spring style, я хочу смешать их в моих примерах приложений. Но там только один метод включен для указанного контроллера, это ограничение spring framework или 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 валидатор для выполнения валидации. Может ли кто-нибудь подсказать мне обходной путь, чтобы смешать их в одном контроллере?

5
задан Bigfei 11 January 2012 в 15:36
поделиться