前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
一、JSR-303簡介
JSR-303 是 JAVA EE 6 中的一項子規范,叫做 Bean Validation,官方參考實現是Hibernate Validator。
此實現與 Hibernate ORM 沒有任何關系。 JSR 303 用于對 Java Bean 中的字段的值進行驗證。?
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中對表單提交的數據方便地驗證。?
注:可以使用注解的方式進行驗證
二、準備校驗時使用的JAR
validation-api-1.0.0.GA.jar:JDK的接口;?
hibernate-validator-4.2.0.Final.jar是對上述接口的實現;?
log4j、slf4j、slf4j-log4j
三、JSR 303 基本的校驗規則
空檢查?
@Null 驗證對象是否為null?
@NotNull 驗證對象是否不為null, 無法查檢長度為0的字符串?
@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會去掉前后空格.?
@NotEmpty 檢查約束元素是否為NULL或者是EMPTY.
Booelan檢查?
@AssertTrue 驗證 Boolean 對象是否為 true?
@AssertFalse 驗證 Boolean 對象是否為 false
長度檢查?
@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的范圍之內?
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期檢查?
@Past 驗證 Date 和 Calendar 對象是否在當前時間之前,驗證成立的話被注釋的元素一定是一個過去的日期?
@Future 驗證 Date 和 Calendar 對象是否在當前時間之后 ,驗證成立的話被注釋的元素一定是一個將來的日期?
@Pattern 驗證 String 對象是否符合正則表達式的規則,被注釋的元素符合制定的正則表達式,regexp:正則表達式 flags: 指定 Pattern.Flag 的數組,表示正則表達式的相關選項。
數值檢查?
建議使用在Stirng,Integer類型,不建議使用在int類型上,因為表單值為“”時無法轉換為int,但可以轉換為Stirng為”“,Integer為null?
@Min 驗證 Number 和 String 對象是否大等于指定的值?
@Max 驗證 Number 和 String 對象是否小等于指定的值?
@DecimalMax 被標注的值必須不大于約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度?
@DecimalMin 被標注的值必須不小于約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度?
@Digits 驗證 Number 和 String 的構成是否合法?
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。?
@Range(min=, max=) 被指定的元素必須在合適的范圍內?
@Range(min=10000,max=50000,message=”range.bean.wage”)?
@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那么對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)?
@CreditCardNumber信用卡驗證?
@Email 驗證是否是郵件地址,如果為null,不進行驗證,算通過驗證。?
@ScriptAssert(lang= ,script=, alias=)?
@URL(protocol=,host=, port=,regexp=, flags=)
四、案例分析
在使用的時候直接對JavaBean進行注解既可以實現對屬性的驗證
public class Order {// 必須不為 null, 大小是 10@NotNull@Size(min = 10, max = 10)private String orderId;// 必須不為空@NotEmptyprivate String customer;// 必須是一個電子信箱地址@Emailprivate String email;// 必須不為空@NotEmptyprivate String address;// 必須不為 null, 必須是下面四個字符串'created', 'paid', 'shipped', 'closed'其中之一// @Status 是一個定制化的 contraint@NotNull@Statusprivate String status;// 必須不為 null@NotNullprivate Date createDate;// 嵌套驗證@Validprivate Product product;// getter 和setter方法
}
?
又例:
?
@NotNull(message = "adultTax不能為空")private Integer adultTax;@NotNull(message = "adultTaxType不能為空")@Min(value = 0, message = "adultTaxType 的最小值為0")@Max(value = 1, message = "adultTaxType 的最大值為1")private Integer adultTaxType;@NotNull(message = "reason信息不可以為空")@Pattern(regexp = "[1-7]{1}", message = "reason的類型值為1-7中的一個類型")private String reason;//訂單取消原因
?
五、下邊是一個完整的例子:
?
public class ValidateTestClass{@NotNull(message = "reason信息不可以為空")@Pattern(regexp = "[1-7]{1}", message = "reason的類型值為1-7中的一個類型")private String reason;//訂單取消原因//get、set方法、有參構造方法、無參構造方法、toString方法省略/*** 驗證參數:就是驗證上述注解的完整方法* @return*/public void validateParams() {//調用JSR303驗證工具,校驗參數Validator validator = Validation.buildDefaultValidatorFactory().getValidator();Set<ConstraintViolation<ValidateTestClass>> violations = validator.validate(this);Iterator<ConstraintViolation<ValidateTestClass>> iter = violations.iterator();if (iter.hasNext()) {String errMessage = iter.next().getMessage();throw new ValidationException(errMessage);}}
}
?
?
?
我們可以寫一個測試類進行驗證:
public class ValidateTestClassValidateTest{@Testpublic void validateParam(){ValidateTestClass validateTestClass = new ValidateTestClass();validateTestClass .setReason(12);validateTestClass .validateParams(); //調用驗證的方法}
}
?
就可以進行測試。
?
并且我們在使用的時候一定要注意,對于某一種驗證規則是適用于一種數據類型的,簡單說來,正則則表達式的驗證對象可以為String類型的,但是不可以為Integer類型的數據,那么當我們使用正則表達式進行驗證的時候就會出現錯誤。?
類似于:
javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang.Integer.
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorManager.verifyResolveWasUnique(ConstraintValidatorManager.java:218)
?
- ?
?
意思就是你這個驗證的注解不應該對該類型進行注解。
到此OK。
?