1. 程式人生 > >Hibernate Validator服務端校驗

Hibernate Validator服務端校驗

         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) 被註釋的元素必須符合指定的正則表示式
@Email 被註釋的元素必須是電子郵箱地址
@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屬性的內容。