同时绑定 spring validator和hibernate validator作为校验
By:Roy.LiuLast updated:2015-11-29
一般情况下,配置hibernate validator, 就可以对参数进行一些基本的校验,但有时候,还需要更进一步的校验,自定义的校验,如果用spring mvc 的话,首先想到的是spring validator, 但有个问题,一旦你用了 @InitBinder 这个, hibernate validator 就会被忽略。
用hibernate 校验的一般方法是在 bean 上注解
在 spring mvc 中一般会这样使用.
单纯的spring validaor 会这样使用 。
在控制层,这样使用
但如果非得这两种方法都同时使用的时候,怎么办呢,因为一旦用了spring validator 的 @InitBinder , hibernate validator 会被忽略掉。 那么问题就出在 @InitBinder 身上,所以,我们只需要去掉这一部分就可以了。
这样两种方法均兼顾到了。
用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 { //... } }
这样两种方法均兼顾到了。
From:一号门
Previous:Spring security method 方法级别的权限控制
Next:mysql 5.7.9 无法启动问题解决
COMMENTS