今天要介紹的是一個簡單卻實用的小工具──SpringBoot Validator,它可以協助我們做物件的驗證,減少物件建立後繁瑣的驗證邏輯,以下會介紹一些常用的方法。首先要使用的話我們要先引入依賴,如果是使用Maven的話可以參考以下程式碼:
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
|
假設我們今天有一個交易的Object,我們希望在實際進入Controller前先驗證傳入值是否正確的話,可以看看以下舉例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class TransactionObject { @Size(min = 10, max = 28, message = "長度必須介於10~28之間") private String transactionId; @Email(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", message = "Email格式不符合") private String email; @NotBlank(message = "Type is not exist") private String transactionType; @NotNull @PositiveOrZero private BigDecimal amount; @PastOrPresent private LocalDateTime transactionDate;
}
|
在TransactionObject中,
@Size會在物件建立時判斷transactionId是否在長度1028之間,若不符合會報Excpetion,訊息為 長度必須介於1028之間。
@Email 利用正規表達式驗證傳入email格式是否符合,若不符合就跳出錯誤訊息。
@NotBlank 類似於撰寫StringUtils.isNotBlank(),@NotNull則用來判斷是否不為Null
@PositiveOrZero 宣告了數值必須是正數或者0
@PastOrPresent 宣告了交易時間,必須是現在或者現在以前,因為不會有未來的交易。
以上,透過物件在建立的同時便完成驗證就是Spring Validator的特色。
通常他會在API Controller就被使用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @RestController public class TransactionController {
private TransactionService transactionService; public TransactionController(TransactionService transactionService) { this.transactionService = transactionService; } @PostMapping("/payment") public TransactionObject payment(@RequestBody @Valid TransactionObject transactionObject) {
boolean success = transactionService.payment(transactionObject); return success ? transactionObject : null; } }
|
其中@Valid 代表了啟動物件驗證的方法,如果不符合就會直接拋出org.springframework.web.bind.MethodArgumentNotValidException,避免讓不合法的物件進入程式內部。
然而,在Controller作物件驗證有一個缺點,就是無法撰寫try catch,這部分要怎麼解決呢,我們明天在說明吧,感恩感謝。
參考資源:
Spring Boot中validation-api和hibernate-validator详解及快速应用实践,@Valid BindingResult实现接口入参自动检验,Java实体字段校验-CSDN博客
https://www.baeldung.com/spring-boot-bean-validation