SpringBoot?中使用?Validation?校驗參數的方法詳解
項目中寫邏輯時,為保證程序的健壯性,需要對各種參數進行判斷,這就導致業(yè)務代碼不只健壯,還十分臃腫。其實 SpringBoot 中已經提供了 Validation 參數驗證框架,可以方便的對參數進行合法性校驗。
1. Validation 介紹
Validation 是用于檢查程序代碼中參數的有效性的框架,作為 Spring 框架中的一個參數校驗工具,集成在 spring-context 包中。
1.1 Validation 注解
Validation 包含了眾多的注解來幫助對Java程序不同類型的參數進行校驗,校驗相關注解分布在spring-boot-starter-validation 依賴的 javax.validation.constraints 包中。
- @Null/@NotnULL,標注的字段必須為null/必須不為null
- @AssertFalse/@AssertTrue,標注字段可以為null,但不為null時必須為false/true
- @Email,標注的字段對應值必須為email格式
- @URL,標注的字段值必須是URL
- @Patten,標注的字段值必須符合定義的正則表達式
其他類似注解的使用可以查看javax.validation.constraints 包中定義注解信息。
1.2 @valid 和 @validated的區(qū)別
在實際使用 Validation 框架時,經常會對 @valid 和 @validated 注解的使用產生誤解,在這里對比一下兩個注解的異同。
- 當使用僅是注解字段屬性并驗證規(guī)范,@Validated 和 @Valid 注解的功能是相同的。
- Spring Validation 驗證框架提供了 @Validated 注解對參數進行驗證,符合Spring’s JSR-303規(guī)范;而 @Valid 注解是 javax 提供的,符合標準的JSR-303規(guī)范。
在注解的使用上,@Validated 注解可以用于類型、方法和參數上;而 @Valid 還可以用于屬性之上。
//@Validated定義
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
Class<?>[] value() default {};
}//@Valid定義
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
public @interface Valid {
}- @Validated 注解可以使用分組校驗的功能,為同一個對象屬性提供不同分組,并根據分組來校驗屬性參數;而 @Valid 注解不支持分組驗證。
- @Valid 注解支持嵌套驗證,當類的屬性是一個復雜對象時,可以使用 @Valid 對該屬性對象中的屬性同時進行校驗;@Validated 并不支持在屬性上使用。
2. SpringBoot 中使用 Validator 校驗參數
2.1 依賴引入
SpringBoot 中使用 Validator 無需單獨引入,因為在 web 依賴包中已經存在,直接使用即可。
<!-- starter web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>如果 SpringBoot 版本比較新,在 web 包中可能已不再包含 Validation 框架,本地使用SpringBoot 2.6.3 版本 web 依賴包已經不再包含。

或者
SpringBoot新版本雖然不在web包中包含,但也提供了start啟動依賴提供相關功能,單獨引入 Jar 包可以使用如下坐標信息:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
另外,引入依賴時還可以引入 hibernate 提供的 validator框架包,不過使用時需要表明版本號信息。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>2.2 標注校驗實體類
后端接收請求參數時,通常是使用 JavaBean 對象來接收參數信息,如果想要對實體類中的屬性進行校驗,則需要對屬性使用校驗相關的注解標注,并且實體對象必須定義 getter/setter方法,可以使用 lombok 的 @Data。
@Data
public class Customer{
private Long id;
@NotNull
private String countryName;
@NotNull
private String countryCode;
@Email
private String email;
@Valid
private Customer parentCustomerInfo;
}2.3 開啟參數校驗
2.3.1 簡單參數校驗
服務接口接收單個簡單參數時,可以在方法參數中直接使用校驗注解。
@PostMapping("/get")
public ResultMap getCustomerInfo(@RequestParam("customerCode") @NotNull(message = "用戶編碼不可以為空!") String customerCode){
return ResultMapUtils().ok();
}單參數校驗時,還需要在 controller 層控制器類中使用 @Validated 標注才會生效。
2.3.2 JavaBean 校驗
在實體類中使用校驗注解標注需要校驗的字段后,還需要在請求層接收參數時開啟參數校驗,只需要在 controller 接口層的參數中使用 @Validated 標注,在接口接收到請求參數時會自動進行校驗。
@Autowired
private CustomerService customerService;
@PostMapping("/execute")
public ResultMap execute(@RequestBody @Validated GeneralDataRequest<CustomerRequest> generalDataRequest){
CustomerRequest request = generalDataRequest.getData();
return customerService.execute(request);
}2.4 捕捉參數校驗異常
使用 Validation 校驗異常后,當參數發(fā)生異常時,會拋出 MethodArgumentNotValidException 類型的異常,為了程序報錯更通俗易懂,可以定義全局異常來捕獲該類型的異常,并統(tǒng)一返回結果信息。
@SLF4j
@ControllerAdvice
public class ExceptionConfig {
/**
* 參數校驗異常
*/
@ResponseBody
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public ResultMap argumentExceptionHandler(MethodArgumentNotValidException exception) {
String message = exception.getBindingResult().getFieldError().getDefaultMessage();
log.info("發(fā)生參數異常:{}", message);
return ResultMapUtils.resultError(ErrorCodeConstant.System.E100003, null, message);
}
}到此這篇關于SpringBoot 中使用 Validation 校驗參數的文章就介紹到這了,更多相關SpringBoot Validation 校驗參數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- SpringBoot使用validation-api實現(xiàn)參數校驗的示例
- SpringBoot集成validation校驗參數遇到的坑
- SpringBoot集成Validation參數校驗
- SpringBoot使用validation做參數校驗說明
- SpringBoot利用validation實現(xiàn)優(yōu)雅的校驗參數
- SpringBoot?Validation提示信息國際化配置方式
- SpringBoot使用Validation進行參數校驗的示例詳解
- springboot中使用Hibernate-Validation校驗參數詳解
- SpringBoot使用Validation校驗參數的詳細過程
- SpringBoot Validation入參校驗國際化的項目實踐
相關文章
Java String、StringBuffer與StringBuilder的區(qū)別
本文主要介紹Java String、StringBuffer與StringBuilder的區(qū)別的資料,這里整理了相關資料及詳細說明其作用和利弊點,有需要的小伙伴可以參考下2016-09-09
使用@Valid+BindingResult進行controller參數校驗方式
這篇文章主要介紹了使用@Valid+BindingResult進行controller參數校驗方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java循環(huán)創(chuàng)建對象內存溢出的解決方法
在Java中,如果在循環(huán)中不當地創(chuàng)建大量對象而不及時釋放內存,很容易導致內存溢出(OutOfMemoryError),所以本文給大家介紹了Java循環(huán)創(chuàng)建對象內存溢出的解決方法,需要的朋友可以參考下2025-01-01
Java中的JPA實體關系:JPA一對一,一對多(多對一),多對多
Java Persistence API(JPA)是Java平臺上的一個對象關系映射(ORM)規(guī)范,用于簡化數據庫操作,其中實體關系的映射是核心內容之一,本文將深入淺出地探討JPA中的三種基本實體關系類型:一對一、一對多、多對多,揭示常見問題、易錯點及其避免策略,希望能幫助大家2024-06-06

