不管是html页面表单提交的对象数据还是和第三方公司进行接口对接,都需要对接收到的数据进行校验(非空、长度、格式等等)。如果使用if一个个进行校验(字段非常多),这是让人崩溃的过程。幸好jdk或hibernate都提供了对object对象的校验,只需加上相应的注解即可。
本人喜欢学习时,都建立个maven小项目进行实践学习。
- 首先引入包的管理
<dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.4</version> </dependency> <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.2.Final</version> </dependency>
- 实现校验类并使用
package com.sk.browser.utils; 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; /** * 数据验证工具类 * @author 高国藩 * @date 2017年4月25日 上午10:32:24 */ 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.sk.system.validator; 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; /** * 定义valid管理器 * @author 高国藩 * @date 2017年4月25日 上午11:16:37 */ public class CustomValidation { /** * 定义金额校验 * @author 高国藩 * @date 2017年4月25日 上午11:06:01 */ @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 {}; } }
package com.sk.system.validator; import java.util.regex.Pattern; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import com.sk.system.validator.CustomValidation.Money; public class MoneyValidator implements ConstraintValidator<Money, Double> { private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式 private Pattern moneyPattern = Pattern.compile(moneyReg); @Override public void initialize(Money arg0) { } @Override public boolean isValid(Double arg0, ConstraintValidatorContext arg1) { if (arg0 == null) //金额是空的,返回true,是因为如果null,则会有@NotNull进行提示 //如果这里false的话,那金额是null,@Money中的message也会进行提示 //自己可以尝试 return true; return moneyPattern.matcher(arg0.toString()).matches(); } }
- 校验注解汇总
其中有一个要注意的就是@NotBlack,只针对String类型有用
另外一点就是javaConfig中的springMvc配置jsr303数据类型校验不起作用的原因,还未找到,请大家明白的及时联系我,感谢了 ~~~