hibernate Validator 是 Bean Validation 的参考实现 。
Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
在日常开发中,Hibernate Validator经常用来验证bean的字段,基于注解,方便快捷高效。
1. Bean Validation 中内置的 constraint
注解作用
@Valid被注释的元素是一个对象,需要检查此对象的所有字段值
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@AssertTrue被注释的元素必须为 true
@AssertFalse被注释的元素必须为 false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式
2. Hibernate Validator 附加的 constraint
注解作用
@Email被注释的元素必须是电子邮箱地址
@Length(min=, max=)被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串的必须非空
@Range(min=, max=)被注释的元素必须在合适的范围内
@NotBlank被注释的字符串的必须非空
@URL(protocol=,host=,port=,regexp=,flags=)被注释的字符串必须是一个有效的url
@CreditCardNumber被注释的字符串必须通过Luhn校验算法,银行卡,信用卡等号码一般都用Luhn计算合法性
@ScriptAssert(lang=, script=, alias=)要有Java Scripting API 即JSR 223(“Scripting for the JavaTM Platform”)的实现
@SafeHtml(whitelistType=,additionalTags=)classpath中要有jsoup包
Hibernate Validator使用方式
第一步,引入下面两个jar
hibernate-validator-4.1.0.Final.jar
validation-api-1.0.0.GA.jar
第二步,实体类加上注解
public class SmsDto extends BaseDto{
@Length(min = 2,message = "参数有误")
@NotBlank(message = "短信参数不允许为空")
private String params;//短信模板参数,json结构
@Min(value = 1L,message = "模板id有误")
@Max(value = Long.MAX_VALUE,message = "模板id有误")
@NotNull(message = "模板id不允许为空")
private Long templateId;//模板id
@Length(min = 11,max=560,message = "手机号长度必须是11~560")
@NotNull(message = "手机号不允许为空")
private String phones;//手机号,多个逗号隔开
@NotBlank(message = "创建人不能为空,如果是系统发送,请传入system")
private String createBy;//创建人
@NotBlank(message = "ip不能为空,如果是系统发送,请传入localhost")
private String ip;//用户的ip地址
//getter setter method...
}
第三步,使用如下方式进行校验
//校验参数
ValidationResult validationResult = ValidatorKit.validateEntity(smsDto);
if(validationResult.hasErrors()){
return Result.fail(validationResult.getFirstErrorMsg());
}
相关工具类
import java.util.Map;
/**
* 校验结果
*/
public class ValidationResult {
//校验结果是否有错
private boolean hasErrors;
//第一条错误信息
private String firstErrorMsg;
//校验错误信息
private Map errorMsg;
//getter setter method...
}
import org.apache.commons.collections.CollectionUtils;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.groups.Default;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 验证工具
*/
public class ValidatorKit {
private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 验证某个实体类
*/
public static ValidationResult validateEntity(T obj) {
ValidationResult result = new ValidationResult();
Set> set = validator.validate(obj, Default.class);
if (CollectionUtils.isNotEmpty(set)) {
result.setHasErrors(true);
Map errorMsg = new HashMap<>();
String firstErrorMsg = null;
for (ConstraintViolation cv : set) {
if (firstErrorMsg == null) {
firstErrorMsg = cv.getMessage();
}
errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage());
}
result.setFirstErrorMsg(firstErrorMsg);
result.setErrorMsg(errorMsg);
}
return result;
}
/**
* 验证某个实体的某个属性
*/
public static ValidationResult validateProperty(T obj, String propertyName) {
ValidationResult result = new ValidationResult();
Set> set = validator.validateProperty(obj, propertyName, Default.class);
if (CollectionUtils.isNotEmpty(set)) {
result.setHasErrors(true);
Map errorMsg = new HashMap<>();
String firstErrorMsg = null;
for (ConstraintViolation cv : set) {
if (firstErrorMsg == null) {
firstErrorMsg = cv.getMessage();
}
errorMsg.put(propertyName, cv.getMessage());
}
result.setFirstErrorMsg(firstErrorMsg);
result.setErrorMsg(errorMsg);
}
return result;
}
}