最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot項(xiàng)目參數(shù)校驗(yàn)方式(Validator)

 更新時(shí)間:2025年02月07日 09:22:43   作者:F0urtEEn  
本文介紹了如何在Spring Boot項(xiàng)目中使用`spring-boot-starter-validation`包和注解來實(shí)現(xiàn)請求參數(shù)校驗(yàn),主要介紹了校驗(yàn)注解的使用方法、校驗(yàn)失敗的異常捕獲以及`@Validated`的分組功能

我們使用spring-boot-starter-validation 包+注解的方式來實(shí)現(xiàn)springboot項(xiàng)目中請求參數(shù)校驗(yàn)。其中spring-boot-starter-validation包中依賴了hibernate-validator包,校驗(yàn)功能就是hibernate-validator包所提供的。

一、 pom文件引入依賴

<!--validation校驗(yàn)依賴包 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

<!--
    <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
     </dependency>
-->

引入spring-boot-starter-validation 包后,可以看見包中依賴了hibernate-validator

二、 校驗(yàn)注解列表

下面的注解用于修飾在需要校驗(yàn)的實(shí)體類屬性上方,或者直接用于修飾請求接口的參數(shù)。

注解作用數(shù)據(jù)類型說明
@Null任意類型驗(yàn)證注解的元素值是null
@NotNull任意類型驗(yàn)證注解的元素值不是null,無法驗(yàn)證''空串
@NotBlankCharSequence子類型驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會去除字符串的首位空格
@NotEmptyCharSequence子類型、Collection、Map、數(shù)組驗(yàn)證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@Min任何Number類型驗(yàn)證注解的元素值大于等于@Min指定的值
@Max任何Number類型驗(yàn)證注解的元素值小于等于@Max指定的值
@DecimalMin任何Number類型驗(yàn)證注解的元素值大于等于@ DecimalMin指定的值
@DecimalMax任何Number類型驗(yàn)證注解的元素值小于等于@ DecimalMax指定的值
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù))任何Number類型驗(yàn)證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限
@Size字符串、Collection、Map、數(shù)組等驗(yàn)證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小
@PastDate、Calendar日期類型驗(yàn)證注解的元素值比當(dāng)前時(shí)間早
@FutureDate、Calendar日期類型驗(yàn)證注解的元素值比當(dāng)前時(shí)間晚
@LengthCharSequence子類型驗(yàn)證注解的元素值長度在min和max區(qū)間內(nèi)
@RangeBigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型驗(yàn)證注解的元素值在最小值和最大值之間
@Email(regexp=正則表達(dá)式,flag=標(biāo)志的模式)CharSequence子類型驗(yàn)證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達(dá)式,flag=標(biāo)志的模式)CharSequence子類型驗(yàn)證注解的元素值與指定的正則表達(dá)式匹配
@Valid任何非原子類型指定遞歸驗(yàn)證關(guān)聯(lián)的對象如用戶對象中有個(gè)地址對象屬性,如果想在驗(yàn)證用戶對象時(shí)一起驗(yàn)證地址對象的話,在地址對象上加@Valid注解即可級聯(lián)驗(yàn)證
@AssertFalseBoolean驗(yàn)證注解的元素值是false
@AssertTrueBoolean驗(yàn)證注解的元素值是true

三、校驗(yàn)注解用法

1. 注解用于修飾在需要校驗(yàn)的實(shí)體類屬性上方

注解的參數(shù)message 用于自定義校驗(yàn)提示信息。

public class User {

    @NotNull
    @Length(min = 2, max = 10, message = "用戶名字必須在2到10個(gè)字母")
    private String name;

    @Min(1)
    @Max(100)
    private int age;

    @NotBlank(message = "聯(lián)系郵箱不能為空")
    @Email(message = "郵箱格式不對")
    private String email;

    @NotBlank(message = "手機(jī)號不能為空")
    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手機(jī)號格式有誤")
    private String mobile;
}

然后在請求接口方法參數(shù)上用@Validated或@Valid修飾,不然校驗(yàn)不生效。

@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/01")
    public Object test01(@Validated User user) {

        System.out.println("===> user: "+user);
        return user;
    }

    @RequestMapping("/02")
    public Object test02(@Valid User user) {

        System.out.println("===> user: "+user);
        return user;
    }
}

2. 直接用于修飾請求接口的參數(shù)

這種方式需要在接口類上面添加@Validated,不然校驗(yàn)不生效。

@RestController
@RequestMapping("/test")
@Validated
public class TestController {

    @RequestMapping("/01")
    public Object test01(@NotNull String name, @Min(1) @Max(100) Integer age) {

        System.out.println("===> name: "+name+", age="+age);
        return name;
    }

    @RequestMapping("/02")
    public Object test02(@Email(message = "郵箱格式不對") String email) {

        System.out.println("===> email: "+email);
        return email;
    }

四、@Validated 與 @Valid的區(qū)別

  1. @Validated是spring框架下的注解,@Valid注解時(shí)javax包下的注解
  2. @Validated對@Valid的封裝,具有更強(qiáng)大的功能,@Validated在@Valid之上提供了分組功能和驗(yàn)證排序功能
  3. @Valid注解可以用在成員屬性上,提供成員屬性是對象類型的嵌套校驗(yàn)功能

五、校驗(yàn)失敗的異常捕獲

1. @Validated或@Valid注解的請求參數(shù)后面緊跟一個(gè)BindingResult對象參數(shù),用于封裝校驗(yàn)異常信息。 注意的是這種方式就不再拋出校驗(yàn)異常了。

    @RequestMapping("/01")
    public Object test01(@Validated User user, BindingResult result) {
        System.out.println("===> user: "+user);
        List<ObjectError> allErrors = result.getAllErrors();
        if (result.hasErrors()) {
            allErrors.forEach(item -> {
                System.out.println(item.getDefaultMessage());
            });
        }

        return user;
    }

    @RequestMapping("/02")
    public Object test02(@Valid User user, BindingResult result) {

        System.out.println("===> user: "+user);
        List<FieldError> fieldErrors = result.getFieldErrors();
        if (result.hasFieldErrors()) {
            fieldErrors.forEach(item -> {
                System.out.println(item.getDefaultMessage());
            });
        }
        return user;
    }

2. 使用全局異常類@RestControllerAdvice 捕捉校驗(yàn)失敗的異常

校驗(yàn)失敗會拋出BindException, ConstraintViolationException, MethodArgumentNotValidException 三種異常

@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * BindException驗(yàn)證異常
     */
    @ExceptionHandler(BindException.class)
    public AjaxResult handleBindException(BindException e)
    {
        BindingResult bindingResult = e.getBindingResult();
        StringBuilder sb = new StringBuilder("校驗(yàn)失敗:");
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(", ");
        }
        String msg = sb.toString();
        log.error(msg);
        return AjaxResult.error(msg);
    }

    /**
     * MethodArgumentNotValidException驗(yàn)證異常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
    {
        BindingResult bindingResult = e.getBindingResult();
        StringBuilder sb = new StringBuilder("校驗(yàn)失敗:");
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(", ");
        }
        String msg = sb.toString();
        log.error(msg);
        return AjaxResult.error(msg);
    }

    /**
     * ConstraintViolationException異常
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public AjaxResult handleConstraintViolationException(ConstraintViolationException e)
    {
        log.error(e.getMessage(), e);
        return AjaxResult.error(e.getMessage());
    }
}

六、@Validated的分組功能

@Validated具有分組功能, 可以根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。

1. 自定義group接口并實(shí)現(xiàn)父接口javax.validation.groups.Default

import javax.validation.groups.Default;

public interface AddGroup extends Default {

}


import javax.validation.groups.Default;

public interface UpdateGroup extends Default {

}

2. 校驗(yàn)注解上提供參數(shù)groups,參數(shù)值就是上面自定義的接口。

public class User {

    @NotNull
    @Length(min = 2, max = 10, groups = UpdateGroup.class)
    private String name;

    @Min(value = 1, groups = AddGroup.class)
    @Max(value = 100, groups = AddGroup.class)
    @NotNull
    private int age;

    @NotBlank(message = "聯(lián)系郵箱不能為空", groups = UpdateGroup.class)
    @Email(message = "郵箱格式不對", groups = AddGroup.class)
    private String email;

}

3. 給@Validated注解參數(shù)value附上不同的分組類, 這樣校驗(yàn)就會根據(jù)相同的group類來校驗(yàn)

    @RequestMapping("/01")
    public Object test01(@Validated(value = AddGroup.class) User user, BindingResult result) {
        System.out.println("===> user: "+user);
        List<ObjectError> allErrors = result.getAllErrors();
        if (result.hasErrors()) {
            allErrors.forEach(item -> {
                System.out.println(item.getDefaultMessage());
            });
        }

        return user;
    }

    @RequestMapping("/02")
    public Object test02(@Validated(value = UpdateGroup.class) User user, BindingResult result) {

        System.out.println("===> user: "+user);
        List<FieldError> fieldErrors = result.getFieldErrors();
        if (result.hasFieldErrors()) {
            fieldErrors.forEach(item -> {
                System.out.println(item.getDefaultMessage());
            });
        }
        return user;
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java語言實(shí)現(xiàn)掃雷游戲(2)

    Java語言實(shí)現(xiàn)掃雷游戲(2)

    這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)掃雷游戲第二部分代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案

    IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決

    原來win10電腦上安裝的是jdk8的版本,因某些原因,現(xiàn)在想換成jdk7的版本,修改環(huán)境變量后,在cmd中執(zhí)行 [java -version]命令,顯示的是7的版本,遇到這樣的問題如何解決呢?下面小編給大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案,一起看看吧
    2023-09-09
  • SpringBoot參數(shù)校驗(yàn)之@Valid與@Validated的用法與場景

    SpringBoot參數(shù)校驗(yàn)之@Valid與@Validated的用法與場景

    這篇文章主要介紹了SpringBoot參數(shù)校驗(yàn)的用法與場景,在實(shí)際開發(fā)中,參數(shù)校驗(yàn)是保證接口安全性和數(shù)據(jù)完整性的重要手段,Spring Boot提供了@Valid和@Validated兩個(gè)核心注解來實(shí)現(xiàn)參數(shù)校驗(yàn),但許多開發(fā)者對它們的區(qū)別和使用場景存在疑惑,需要的朋友可以參考下
    2025-02-02
  • Java實(shí)現(xiàn)輕松處理日期和時(shí)間的API小結(jié)

    Java實(shí)現(xiàn)輕松處理日期和時(shí)間的API小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中的日期和時(shí)間API,可以輕松處理日期和時(shí)間,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java設(shè)計(jì)模式之java狀態(tài)模式詳解

    Java設(shè)計(jì)模式之java狀態(tài)模式詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之狀態(tài)模式定義與用法,結(jié)合具體實(shí)例形式詳細(xì)分析了Java狀態(tài)模式的概念、原理、定義及相關(guān)操作技巧,需要的朋友可以參考下
    2021-09-09
  • 搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查功能

    搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查功能

    這篇文章主要介紹了搭建MyBatis-Plus框架并進(jìn)行數(shù)據(jù)庫增刪改查,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java集合快速失敗與安全失敗解析

    Java集合快速失敗與安全失敗解析

    這篇文章主要介紹了Java集合快速失敗與安全失敗解析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java多線程創(chuàng)建及線程安全詳解

    java多線程創(chuàng)建及線程安全詳解

    多線程是日常開發(fā)中的常用知識,也是難用知識。通這篇文章主要給大家介紹了關(guān)于java多線程創(chuàng)建及線程安全的相關(guān)資料,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Mybatis表的關(guān)聯(lián)查詢詳情

    Mybatis表的關(guān)聯(lián)查詢詳情

    這篇文章主要介紹了Mybatis表的關(guān)聯(lián)查詢詳情,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 基于SpringBoot bootstrap.yml配置未生效的解決

    基于SpringBoot bootstrap.yml配置未生效的解決

    這篇文章主要介紹了基于SpringBoot bootstrap.yml配置未生效的解決方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

方山县| 竹山县| 吉安市| 凤城市| 临泉县| 青河县| 马山县| 沅陵县| 丰台区| 平湖市| 贵定县| 邢台市| 民和| 宾阳县| 金门县| 沅江市| 永平县| 达尔| 沁水县| 商河县| 梧州市| 原阳县| 辽阳县| 宜阳县| 阜城县| 梨树县| 合山市| 米林县| 仙游县| 江津市| 丹凤县| 萨嘎县| 峨山| 玉屏| 安吉县| 石林| 大方县| 巴中市| 庆云县| 南丹县| 藁城市|