SpringBoot?中使用?Validation?校驗(yàn)參數(shù)的方法詳解
項(xiàng)目中寫(xiě)邏輯時(shí),為保證程序的健壯性,需要對(duì)各種參數(shù)進(jìn)行判斷,這就導(dǎo)致業(yè)務(wù)代碼不只健壯,還十分臃腫。其實(shí) SpringBoot 中已經(jīng)提供了 Validation 參數(shù)驗(yàn)證框架,可以方便的對(duì)參數(shù)進(jìn)行合法性校驗(yàn)。
1. Validation 介紹
Validation 是用于檢查程序代碼中參數(shù)的有效性的框架,作為 Spring 框架中的一個(gè)參數(shù)校驗(yàn)工具,集成在 spring-context 包中。
1.1 Validation 注解
Validation 包含了眾多的注解來(lái)幫助對(duì)Java程序不同類(lèi)型的參數(shù)進(jìn)行校驗(yàn),校驗(yàn)相關(guān)注解分布在spring-boot-starter-validation
依賴(lài)的 javax.validation.constraints
包中。
- @Null/@NotnULL,標(biāo)注的字段必須為null/必須不為null
- @AssertFalse/@AssertTrue,標(biāo)注字段可以為null,但不為null時(shí)必須為false/true
- @Email,標(biāo)注的字段對(duì)應(yīng)值必須為email格式
- @URL,標(biāo)注的字段值必須是URL
- @Patten,標(biāo)注的字段值必須符合定義的正則表達(dá)式
其他類(lèi)似注解的使用可以查看javax.validation.constraints
包中定義注解信息。
1.2 @valid 和 @validated的區(qū)別
在實(shí)際使用 Validation 框架時(shí),經(jīng)常會(huì)對(duì) @valid 和 @validated 注解的使用產(chǎn)生誤解,在這里對(duì)比一下兩個(gè)注解的異同。
- 當(dāng)使用僅是注解字段屬性并驗(yàn)證規(guī)范,@Validated 和 @Valid 注解的功能是相同的。
- Spring Validation 驗(yàn)證框架提供了 @Validated 注解對(duì)參數(shù)進(jìn)行驗(yàn)證,符合Spring’s JSR-303規(guī)范;而 @Valid 注解是 javax 提供的,符合標(biāo)準(zhǔn)的JSR-303規(guī)范。
在注解的使用上,@Validated 注解可以用于類(lèi)型、方法和參數(shù)上;而 @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 注解可以使用分組校驗(yàn)的功能,為同一個(gè)對(duì)象屬性提供不同分組,并根據(jù)分組來(lái)校驗(yàn)屬性參數(shù);而 @Valid 注解不支持分組驗(yàn)證。
- @Valid 注解支持嵌套驗(yàn)證,當(dāng)類(lèi)的屬性是一個(gè)復(fù)雜對(duì)象時(shí),可以使用 @Valid 對(duì)該屬性對(duì)象中的屬性同時(shí)進(jìn)行校驗(yàn);@Validated 并不支持在屬性上使用。
2. SpringBoot 中使用 Validator 校驗(yàn)參數(shù)
2.1 依賴(lài)引入
SpringBoot 中使用 Validator 無(wú)需單獨(dú)引入,因?yàn)樵?web 依賴(lài)包中已經(jīng)存在,直接使用即可。
<!-- starter web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
如果 SpringBoot 版本比較新,在 web 包中可能已不再包含 Validation 框架,本地使用SpringBoot 2.6.3 版本 web 依賴(lài)包已經(jīng)不再包含。
或者
SpringBoot新版本雖然不在web包中包含,但也提供了start啟動(dòng)依賴(lài)提供相關(guān)功能,單獨(dú)引入 Jar 包可以使用如下坐標(biāo)信息:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
另外,引入依賴(lài)時(shí)還可以引入 hibernate 提供的 validator框架包,不過(guò)使用時(shí)需要表明版本號(hào)信息。
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency>
2.2 標(biāo)注校驗(yàn)實(shí)體類(lèi)
后端接收請(qǐng)求參數(shù)時(shí),通常是使用 JavaBean 對(duì)象來(lái)接收參數(shù)信息,如果想要對(duì)實(shí)體類(lèi)中的屬性進(jìn)行校驗(yàn),則需要對(duì)屬性使用校驗(yàn)相關(guān)的注解標(biāo)注,并且實(shí)體對(duì)象必須定義 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 開(kāi)啟參數(shù)校驗(yàn)
2.3.1 簡(jiǎn)單參數(shù)校驗(yàn)
服務(wù)接口接收單個(gè)簡(jiǎn)單參數(shù)時(shí),可以在方法參數(shù)中直接使用校驗(yàn)注解。
@PostMapping("/get") public ResultMap getCustomerInfo(@RequestParam("customerCode") @NotNull(message = "用戶編碼不可以為空!") String customerCode){ return ResultMapUtils().ok(); }
單參數(shù)校驗(yàn)時(shí),還需要在 controller 層控制器類(lèi)中使用 @Validated 標(biāo)注才會(huì)生效。
2.3.2 JavaBean 校驗(yàn)
在實(shí)體類(lèi)中使用校驗(yàn)注解標(biāo)注需要校驗(yàn)的字段后,還需要在請(qǐng)求層接收參數(shù)時(shí)開(kāi)啟參數(shù)校驗(yàn),只需要在 controller 接口層的參數(shù)中使用 @Validated 標(biāo)注,在接口接收到請(qǐng)求參數(shù)時(shí)會(huì)自動(dòng)進(jìn)行校驗(yàn)。
@Autowired private CustomerService customerService; @PostMapping("/execute") public ResultMap execute(@RequestBody @Validated GeneralDataRequest<CustomerRequest> generalDataRequest){ CustomerRequest request = generalDataRequest.getData(); return customerService.execute(request); }
2.4 捕捉參數(shù)校驗(yàn)異常
使用 Validation 校驗(yàn)異常后,當(dāng)參數(shù)發(fā)生異常時(shí),會(huì)拋出 MethodArgumentNotValidException 類(lèi)型的異常,為了程序報(bào)錯(cuò)更通俗易懂,可以定義全局異常來(lái)捕獲該類(lèi)型的異常,并統(tǒng)一返回結(jié)果信息。
@SLF4j @ControllerAdvice public class ExceptionConfig { /** * 參數(shù)校驗(yàn)異常 */ @ResponseBody @ExceptionHandler(value = MethodArgumentNotValidException.class) public ResultMap argumentExceptionHandler(MethodArgumentNotValidException exception) { String message = exception.getBindingResult().getFieldError().getDefaultMessage(); log.info("發(fā)生參數(shù)異常:{}", message); return ResultMapUtils.resultError(ErrorCodeConstant.System.E100003, null, message); } }
到此這篇關(guān)于SpringBoot 中使用 Validation 校驗(yàn)參數(shù)的文章就介紹到這了,更多相關(guān)SpringBoot Validation 校驗(yàn)參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗(yàn)的示例
- SpringBoot集成validation校驗(yàn)參數(shù)遇到的坑
- SpringBoot集成Validation參數(shù)校驗(yàn)
- SpringBoot使用validation做參數(shù)校驗(yàn)說(shuō)明
- SpringBoot利用validation實(shí)現(xiàn)優(yōu)雅的校驗(yàn)參數(shù)
- SpringBoot?Validation提示信息國(guó)際化配置方式
- SpringBoot使用Validation進(jìn)行參數(shù)校驗(yàn)的示例詳解
- springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解
- SpringBoot使用Validation校驗(yàn)參數(shù)的詳細(xì)過(guò)程
- SpringBoot Validation入?yún)⑿r?yàn)國(guó)際化的項(xiàng)目實(shí)踐
相關(guān)文章
Java8 CompletableFuture 異步執(zhí)行操作
CompletableFuture是java8提供的基于異步操作的封裝,日常開(kāi)發(fā)中經(jīng)常會(huì)用到,接下來(lái)通過(guò)本文給大家介紹Java8 CompletableFuture 異步執(zhí)行操作,感興趣的朋友一起看看吧2021-06-06Java中實(shí)現(xiàn)List分隔成子List詳解
大家好,本篇文章主要講的是Java中實(shí)現(xiàn)List分隔成子List詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01詳解如何利用jasypt實(shí)現(xiàn)配置文件加密
Jasypt?(Java?Simplified?Encryption)?是一個(gè)?java?庫(kù),它允許開(kāi)發(fā)人員以最小的成本將基本的加密功能添加到項(xiàng)目中,而無(wú)需深入了解密碼學(xué)的工作原理。本文將利用jasypt實(shí)現(xiàn)配置文件加密,感興趣的可以學(xué)習(xí)一下2022-07-07Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼
這篇文章主要介紹了Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10FactoryBean?BeanFactory方法使用示例詳解講解
這篇文章主要為大家介紹了FactoryBean?BeanFactory方法使用示例詳解講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12詳解Spring中InitializingBean接口的功能
這篇文章主要介紹了Spring中InitializingBean接口的功能,講述了spring中InitializingBean接口的功能簡(jiǎn)介說(shuō)明,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05