Hibernate Validator服務端校驗
阿新 • • 發佈:2018-11-27
Hibernate Validator 是 Bean Validation 的參考實現。Hibernate Validator 提供了 JSR 303 規範中所有內建 constraint(約束) 的實現,除此之外還有一些附加的 constraint。
在日常開發中,Hibernate Validator經常用來驗證bean的欄位,基於註解,方便快捷高效。
1、Bean校驗的註解
常用註解如下:
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) | 被註釋的元素必須符合指定的正則表示式 |
被註釋的元素必須是電子郵箱地址 | |
@Length | 被註釋的字串的大小必須在指定的範圍內 |
@NotEmpty | 被註釋的字串的必須非空 |
@Range | 被註釋的元素必須在合適的範圍內 |
@NotBlank | 被註釋的字串的必須非空 |
@URL(protocol=,host=, port=,regexp=, flags=) | 被註釋的字串必須是一個有效的url |
@CreditCardNumber | 被註釋的字串必須通過Luhn校驗演算法,銀行卡,信用卡等號碼一般都用Luhn計算合法性 |
【注意】上表中常用註解都紅色標明。
2、應用
【pom】
<!-- hibernate-validator服務端校驗-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
@Length(min = 6, max = 30, message = "使用者名稱只能在64~30位之間")
private String username;// 使用者名稱
@Length(min = 6, max = 30, message = "使用者名稱只能在4~30位之間")
private String password;// 密碼
@Pattern(regexp = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\\\d{8}$\n", message = "手機號格式不正確")
private String phone;// 電話
@Size(min = 18, max = 70, message = "年齡在在[18,70]之間")
private String age;
@NotNull(message = "郵件不能為空!")
@Email(message = "郵件格式不正確")
private String uEmail;
/**
* 狀態
**/
@Pattern(regexp = "0[0123]", message = "狀態只能為00或01或02或03")
private String status;
@NotNull(message = "日期不能為空!")
@Past(message = "你只能輸入過去的日期")
private Date birthday;
3、@Valid註解
@Valid註解用於校驗,所屬包為:javax.validation.Valid。在Controller層的方法要校驗的引數上新增@Valid註解,並且需要傳入BindingR軟Result物件,用於獲取校驗失敗的情況下的反饋資訊:
//這裡只是為了說明@Valid和BindingResult
@PostMapping("register")
public ResponseEntity<Void> register(@Valid User user, BindingResult bindingResult, @RequestParam("code")String code) {
if(bindingResult.hasErrors()){
//bindingResult.getFieldError()得到一個錯誤,getDefaultMessage()返回值就是hibernate validate中@xx註解的message
System.out.println(bindingResult.getFieldError().getDefaultMessage());
//bindingResult.getFieldErrors獲取多個錯誤,返回值是list
bindingResult.getFieldErrors().stream().map(e->e.getDefaultMessage()).collect(Collectors.joining());
return null;
}
userService.register(user, code);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
【說明】bindingResult.getFieldError.getDefaultMessage()用於獲取相應欄位上新增的message中的內容,如:@Email註解中message屬性的內容。