java使用validator进行校验

日常开发过程中,在对form表单提交和对外接口开发,都会遇到对提交的参数进行校验,找到合适的检验框架。

下面写一个小demo

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.man.basic</groupId> <artifactId>ValidateDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.4</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.3.Final</version> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> </dependencies> </project>

 

user 类:

package com.man.demo;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

import com.man.userdefined.Money;

public class User {

    @NotBlank(message = "用户名不能为空")
    private String userName;

    @NotBlank(message = "年龄不能为空")
    @Pattern(regexp = "^[0-9]{1,2}$", message = "年龄是整数")
    private String age;

    /**
     * 如果是空,则不校验,如果不为空,则校验
     */
    @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$", message = "出生日期格式不正确")
    private String birthday;

    @NotBlank(message = "学校不能为空")
    private String school;
    
    @NotNull(message="金额不能为空")
    @Money(message="金额格式不正确")
    private Double money;    

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }
}

工具类:

package com.man.demo;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;

public class ValidatorUtil {

    private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    public static <T> Map<String, StringBuffer> validate(T obj) {
        
        Map<String, StringBuffer> errorMap = null;
        
        Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
        if (set != null && set.size() > 0) {
            errorMap = new HashMap<String, StringBuffer>();
            String property = null;
            for (ConstraintViolation<T> cv : set) {
                // 这里循环获取错误信息,可以自定义格式
                property = cv.getPropertyPath().toString();
                if (errorMap.get(property) != null) {
                    errorMap.get(property).append("," + cv.getMessage());
                } else {
                    StringBuffer sb = new StringBuffer();
                    sb.append(cv.getMessage());
                    errorMap.put(property, sb);
                }
            }
        }
        return errorMap;
    }
}

测试类:

package com.man.demo;

import java.util.Map;

public class ValidatorTest {
    
    public static void main(String[] args) {
        
        User s = new User();
        s.setSchool("test");
        long startTime = System.currentTimeMillis();
        print(ValidatorUtil.validate(s));        
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
                
        s.setUserName("小明");
        s.setAge("a10");
        s.setBirthday("2016-9-1");
        startTime = System.currentTimeMillis();
        print(ValidatorUtil.validate(s));
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
    }

    private static void print(Map<String, StringBuffer> errorMap) {        
        if (errorMap != null) {
            for (Map.Entry<String, StringBuffer> m : errorMap.entrySet()) {
                System.out.println(m.getKey() + ":" + m.getValue().toString());
            }
        }        
    }
}

输出结果:

六月 18, 2019 2:53:45 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
userName:用户名不能为空
age:年龄不能为空
===============耗时(毫秒)=487
birthday:出生日期格式不正确
age:年龄是整数
===============耗时(毫秒)=2

 

当hibernate-validator 不满足验证时,可以自定义验证:

package com.man.userdefined;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class)
public @interface Money {
    String message() default"不是金额形式";
       
    Class<?>[] groups() default {};
   
    Class<? extends Payload>[] payload() default {};
}

 

实现:ConstraintValidator

package com.man.userdefined;

import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MoneyValidator implements ConstraintValidator<Money, Double> {
 
    private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式
    
    private Pattern moneyPattern = Pattern.compile(moneyReg);
   
    public void initialize(Money money) {}
 
    public boolean isValid(Double value, ConstraintValidatorContext arg1) {
       if (value == null)
           //金额是空的,返回true,是因为如果null,则会有@NotNull进行提示
           //如果这里false的话,那金额是null,@Money中的message也会进行提示
           //自己可以尝试
           return true;
       return moneyPattern.matcher(value.toString()).matches();
    }
    
}

 

测试:

public static void main(String[] args) {
        
        User s = new User();
        s.setSchool("test");
        s.setMoney(20.00001);
        long startTime = System.currentTimeMillis();
        print(ValidatorUtil.validate(s));        
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
                
        s.setUserName("小明");
        s.setAge("a10");
        s.setBirthday("2016-9-1");
        startTime = System.currentTimeMillis();
        print(ValidatorUtil.validate(s));
        System.out.println("===============耗时(毫秒)=" + (System.currentTimeMillis() - startTime));
    }

 

输出结果

六月 18, 2019 3:19:32 下午 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.1.3.Final
money:金额格式不正确
userName:用户名不能为空
age:年龄不能为空
===============耗时(毫秒)=276
birthday:出生日期格式不正确
money:金额格式不正确
age:年龄是整数
===============耗时(毫秒)=2

 

posted @ 2019-06-18 15:22  珂瑞  阅读(108)  评论(0)    收藏  举报