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

摘要: 一般情况下,配置hibernate validator,  就可以对参数进行一些基本的校验,但有时候,还需要更进一步的校验,自定义的校验,如果用spring mvc 的话,首先想到的是spring validator, 但有个问题,一旦你用了 @InitBinder 这个, hibernate validator 就会被忽略

一般情况下,配置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 {
			//...
		}

	}


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

上一篇: Spring security method 方法级别的权限控制
下一篇: mysql 5.7.9 无法启动问题解决
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号