在前後端分離的開發模式中,後端對前端傳入的參數的校驗成了必不可少的一個環節。但是在多參數的情況下,在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的測試結果如下:
具體的代碼可以在我的gitee上面查看,springboot_validator
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※想知道最厲害的網頁設計公司"嚨底家"!
※別再煩惱如何寫文案,掌握八大原則!
※產品缺大量曝光嗎?你需要的是一流包裝設計!