Spring-validator 校验器

Spring校验器的目的

以下是Spring官方文档的解释

There are pros and cons for considering validation as business logic, and Spring offers a design for validation (and data binding) that does not exclude either one of them. Specifically validation should not be tied to the web tier, should be easy to localize and it should be possible to plug in any validator available. Considering the above, Spring has come up with a Validator interface that is both basic ands eminently usable in every layer of an application.

maven依赖包

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
<dependency>  
    <groupId>org.hibernate</groupId>  
    <artifactId>hibernate-validator</artifactId>  
    <version>5.2.4.Final</version>  
</dependency> 

使用Validator例子

待校验的类 Person.java

public class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    } 
}

类校验器PersonValidator.java,需要实现Spring提供的Validator

public class PersonValidator implements Validator{

    public boolean supports(Class<?> clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    public void validate(Object obj, Errors e) {
        ValidationUtils.rejectIfEmpty(e, "name", "name.empty");
        Person p = (Person) obj;
        if (p.getAge() < 0) {
            e.rejectValue("age", "negative value");
        } else if (p.getAge() > 110) {
            e.rejectValue("age", "too.darn.old");
        }
        e.reject("xcvxcvxcv");
    }

}

测试校验器TestPersonValidation.java

public class TestPersonValidation {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(190);
        person.setName(null);
        DataBinder db = new DataBinder(person, person.getClass().getName());
        db.setValidator(new PersonValidator());
        db.validate();
        BindingResult br = db.getBindingResult();
        System.out.println(br);
        List<ObjectError> list = br.getAllErrors();
        for (ObjectError objectError : list) {
            FieldError fe = (FieldError)objectError;
            System.out.println(fe.getField());
            System.out.println(fe.getRejectedValue());
            System.out.println(fe.getCode());
        }

    }

}

控制台打印结果:

org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'com.linjw.business.validation.beans.Person' on field 'name': rejected value [null]; codes [name.empty.com.linjw.business.validation.beans.Person.name,name.empty.name,name.empty.java.lang.String,name.empty]; arguments []; default message [null]
Field error in object 'com.linjw.business.validation.beans.Person' on field 'age': rejected value [190]; codes [too.darn.old.com.linjw.business.validation.beans.Person.age,too.darn.old.age,too.darn.old.int,too.darn.old]; arguments []; default message [null]
name
null
name.empty
age
190
too.darn.old

与Spring MVC天衣无缝地结合

当含有@Valid参数的方法被调用时,Validator实例会被调用。
我们有两种方法可以配置Validator。
一种是调用binder.setValidators。这样可以使每个Controller只含有一个对应的Validator.

@Controller
public class ValidationController {

    @RequestMapping(value="personpage")
    public void personpage() {
    }

    @RequestMapping(value="/person", method=RequestMethod.POST)
    public void person(@Valid Person person, BindingResult bindingResult) {
        bindingResult.hasErrors();
        System.out.println(bindingResult);
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidators(new PersonValidator());
    }
}

第二种是配置一个全局的校验器(GlobalValidator),这样,所有Controller都会经过GlobalValidator。

public class GlobalValidator  implements Validator {

    public boolean supports(Class<?> clazz) {
        return true;
    }

    public void validate(Object target, Errors errors) {

        errors.reject("calling GlobalValidator, added a global error...");
    }

}

然后在mvc配置文件中加上validator="globalValidator"

<context:component-scan base-package="xxx"/>
<bean id="globalValidator" class="GlobalValidator"></bean>
<mvc:annotation-driven validator="globalValidator"/>

改造下ValidationController,把setValidator改成addValidators。这样当访问person时,就会既经过GlobalValidator的校验,也会经过PersonValidator的校验。

@Controller
public class ValidationController {

    @RequestMapping(value="personpage")
    public void personpage() {
    }

    @RequestMapping(value="/person", method=RequestMethod.POST)
    public void person(@Valid Person person, BindingResult bindingResult) {
        bindingResult.hasErrors();
        System.out.println(bindingResult);
    }

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(new PersonValidator());
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值