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

浙公网安备 33010602011771号