SpringBoot整合Hibernate Validator實現參數驗證功能


  在前后端分離的開發模式中,后端對前端傳入的參數的校驗成了必不可少的一個環節。但是在多參數的情況下,在controller層加上參數驗證,會顯得特別臃腫,並且會有許多的重復代碼。這里可以引用Hibernate Validator來解決這個問題,直接在實體類進行參數校驗,驗證失敗直接返回錯誤信息給前端,減少controller層的代碼量。

一、pom引入Hibernate Validator

<!-- 驗證器 -->
<dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.1.5.Final</version>
</dependency>

 二、通過注解在實體類進行參數校驗

@Data
public class UserModel {

    @NotNull(message = "用戶名稱不能為空!")
    private String userName;

    @NotNull(message = "age不能為null!")
    @Range(min = 1, max = 888, message = "范圍為1至888")
    private Integer age;

    /**
     * 日期格式化轉換
     */
    @NotNull(message = "日期不能為null!")
    private Date date;
}

這里用到的參數校驗的注解有@NotNull和@Range,message是到時候我們返回給前端的信息,注解的具體意思如下:

@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  被注釋的元素必須在合適的范圍內

 三、controller層的方法加上@Valid注解

@PostMapping("/testPost")
public Object testPost(@RequestBody @Valid UserModel userModel, BindingResult result){
if(result.hasErrors()){
for(ObjectError error:result.getAllErrors()){
return error.getDefaultMessage();
}
}
return userModel;
}

controller層這里只需要在實體類的前面加上@Valid注解,這個注解可以實現數據的驗證。這里BindingResult是存儲了校驗時的錯誤信息,驗證有誤時將錯誤信息返回給前端。這里不使用BindingResult的時候,控制台會報MethodArgumentNotValidException,這里可以通過自定義異常類來捕捉它,然后去掉BindingResult,以及難看的if判斷。

四、自定義異常類捕捉MethodArgumentNotValidException

@RestControllerAdvice
public class GlobalExceptionAdvice {

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public JsonData validException(MethodArgumentNotValidException e) {
        //驗證post請求的參數合法性
        MethodArgumentNotValidException notValidException = e;
        String msg = notValidException.getBindingResult().getFieldError().getDefaultMessage();
        return JsonData.buildError(msg);
    }
}

使用PostMan的測試結果如下:

具體的代碼可以在我的github上面查看https://github.com/ruiyeclub/SpringBoot-Hello


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM