hibernate Validator 是 Bean Validation 的參考實現(xiàn) 。
Hibernate Validator 提供了 JSR 303 規(guī)范中所有內(nèi)置 constraint 的實現(xiàn),除此之外還有一些附加的 constraint。
在日常開發(fā)中,Hibernate Validator經(jīng)常用來驗證bean的字段,基于注解,方便快捷高效。
1. Bean Validation 中內(nèi)置的 constraint
注解作用
@Valid被注釋的元素是一個對象,需要檢查此對象的所有字段值
@Null被注釋的元素必須為 null
@NotNull被注釋的元素必須不為 null
@AssertTrue被注釋的元素必須為 true
@AssertFalse被注釋的元素必須為 false
@Min(value)被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@Max(value)被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value)被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value)被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值
@Size(max, min)被注釋的元素的大小必須在指定的范圍內(nèi)
@Digits (integer, fraction)被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)
@Past被注釋的元素必須是一個過去的日期
@Future被注釋的元素必須是一個將來的日期
@Pattern(value)被注釋的元素必須符合指定的正則表達式
2. Hibernate Validator 附加的 constraint
注解作用
@Email被注釋的元素必須是電子郵箱地址
@Length(min=, max=)被注釋的字符串的大小必須在指定的范圍內(nèi)
@NotEmpty被注釋的字符串的必須非空
@Range(min=, max=)被注釋的元素必須在合適的范圍內(nèi)
@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”)的實現(xiàn)
@SafeHtml(whitelistType=,additionalTags=)classpath中要有jsoup包
hibernate-validator-4.1.0.Final.jar
validation-api-1.0.0.GA.jar
public class SmsDto extends BaseDto{
@Length(min = 2,message = "參數(shù)有誤")
@NotBlank(message = "短信參數(shù)不允許為空")
private String params;//短信模板參數(shù),json結(jié)構(gòu)
@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 = "創(chuàng)建人不能為空,如果是系統(tǒng)發(fā)送,請傳入system")
private String createBy;//創(chuàng)建人
@NotBlank(message = "ip不能為空,如果是系統(tǒng)發(fā)送,請傳入localhost")
private String ip;//用戶的ip地址
//getter setter method...
}
//校驗參數(shù)
ValidationResult validationResult = ValidatorKit.validateEntity(smsDto);
if(validationResult.hasErrors()){
return Result.fail(validationResult.getFirstErrorMsg());
}
import java.util.Map;
/**
* 校驗結(jié)果
*/
public class ValidationResult {
//校驗結(jié)果是否有錯
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;
}
}