欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot?中使用?Validation?校驗(yàn)參數(shù)的方法詳解

 更新時(shí)間:2022年05月23日 11:00:28   作者:工作事小摸魚(yú)事大  
Validation?是用于檢查程序代碼中參數(shù)的有效性的框架,作為?Spring?框架中的一個(gè)參數(shù)校驗(yàn)工具,集成在?spring-context?包中,這篇文章主要介紹了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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 百度Java面試題 前200頁(yè)精選(上)

    百度Java面試題 前200頁(yè)精選(上)

    這篇文章主要為大家分享了Java面試資源,百度“Java面試題”前200頁(yè)都在這里了,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java8 CompletableFuture 異步執(zhí)行操作

    Java8 CompletableFuture 異步執(zhí)行操作

    CompletableFuture是java8提供的基于異步操作的封裝,日常開(kāi)發(fā)中經(jīng)常會(huì)用到,接下來(lái)通過(guò)本文給大家介紹Java8 CompletableFuture 異步執(zhí)行操作,感興趣的朋友一起看看吧
    2021-06-06
  • 高效的java版排列組合算法

    高效的java版排列組合算法

    這篇文章主要為大家詳細(xì)介紹了高效的java版排列組合算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Spring Boot自動(dòng)注入的原理分析

    Spring Boot自動(dòng)注入的原理分析

    這篇文章主要給大家分析介紹了關(guān)于Spring Boot自動(dòng)注入的原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot自具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java中實(shí)現(xiàn)List分隔成子List詳解

    Java中實(shí)現(xiàn)List分隔成子List詳解

    大家好,本篇文章主要講的是Java中實(shí)現(xiàn)List分隔成子List詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 詳解如何利用jasypt實(shí)現(xiàn)配置文件加密

    詳解如何利用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-07
  • Mybatis傳入List實(shí)現(xiàn)批量更新的示例代碼

    Mybatis傳入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-10
  • FactoryBean?BeanFactory方法使用示例詳解講解

    FactoryBean?BeanFactory方法使用示例詳解講解

    這篇文章主要為大家介紹了FactoryBean?BeanFactory方法使用示例詳解講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java中的二維數(shù)組的賦值與輸出方式

    Java中的二維數(shù)組的賦值與輸出方式

    這篇文章主要介紹了Java中的二維數(shù)組的賦值與輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解Spring中InitializingBean接口的功能

    詳解Spring中InitializingBean接口的功能

    這篇文章主要介紹了Spring中InitializingBean接口的功能,講述了spring中InitializingBean接口的功能簡(jiǎn)介說(shuō)明,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論