一般情况下,配置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 {
//...
}
}
这样两种方法均兼顾到了。