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

SpringBoot參數(shù)校驗的最佳實戰(zhàn)教程

 更新時間:2021年08月25日 09:21:19   作者:范閑  
開發(fā)過程中,后臺的參數(shù)校驗是必不可少的,下面這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗的最佳實戰(zhàn),文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

我們這里使用hibernate-validator作為對象參數(shù)驗證器,所以在正式介紹SpringBoot參數(shù)驗證之前,需要先簡單了解一下hibernate-validator的使用。

hibernate-validator基本使用

引入依賴

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.17.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>

編寫需要驗證對象

驗證要求 person對象的用戶名不能為空,年齡在1-150歲之間。

@Data
public class Person {

    @NotBlank(message = "username must not be null")
    private String username;

    @Min(value = 1, message = "age must be >= 1")
    @Max(value = 150, message = "age must be < 150")
    private Integer age;
}

驗證對象屬性是否符合要求

    /**
     * 對象驗證器
     */
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation
                        .byProvider(HibernateValidator.class)
                        .configure()
                        // 驗證屬性時,如果有一個驗證不通過就返回,不需要驗證所有屬性
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    @Test
    public void test() throws Exception {
        Person person = new Person();
        Set<ConstraintViolation<Person>> validate = validator().validate(person);
        validate.forEach(errorParam -> {
            System.out.println(errorParam.getMessage());
        });
    }
  1. 我們只需要驗證的對象實例即可完成對象驗證,如果驗證成功,那么返回一個空的集合,如果驗證失敗,會返回具體的驗證失敗的屬性信息。
  2. 我們輸出驗證失敗的錯誤信息如下:
username must not be null

驗證規(guī)則

validator提供了大量的驗證注解供我們使用,主要以下幾類:

空/非空驗證

  1. @Null 元素必須為空
  2. @NotNull 元素不能為空,空字符串""是非空

以下所有驗證規(guī)則都在元素非空的時候才會進行驗證,如果傳入的元素為空,驗證都會通過。

bool

  1. @AssertTrue 元素必須為true
  2. @AssertFalse 元素必須為false

時間

  1. @Future 元素必須是未來的某個時間。
  2. @FutureOrPresent 元素必須是未來或者現(xiàn)在的某個時間。
  3. @Past 元素必須是過去的某個時間。
  4. @PastOrPresent 元素必須是過去或者現(xiàn)在的某個時間。

數(shù)學

數(shù)字類型可以是BigDecimal、BigInteger、CharSequence 、byte 、 short 、 int 、 long以及它們各自的包裝器類型

  1. @Digits 元素必須是該數(shù)字類型下可以被接受的數(shù)值范圍內(nèi)。
  2. @Negative 元素必須是負數(shù)
  3. @NegativeOrZero  元素必須小于等于0
  4. @Positive 元素必須大于0
  5. @PositiveOrZero 元素必須大于等于0
  6. @Max,@Min 元素的大小必須符合指定大小

字符串

  1. @Email 郵箱格式驗證
  2. @NotBlack 驗證字符串非空,空字符串""也屬于空
  3. @Pattern 字符串正則驗證

模板正則

validator提供了字符串模板正則的注解,這里提供一份常用的正則表達式,大家可以直接作為常量工具類放到項目里使用

public interface ValidatorPattern {

    /**
     * 正則表達式:驗證用戶名
     * 1.長度在5-17
     * 2.由大寫小寫字母構(gòu)成
     */
    String REGEX_USERNAME = "^[a-zA-Z]\w{5,17}$";

    /**
     * 正則表達式:驗證密碼
     * 密碼只能為 6 - 12位數(shù)字,字母及常用符號組成。
     */
    String REGEX_PASSWORD = "^(?=.*[a-zA-Z])(?=.*[0-9])[A-Za-z0-9._~!@#$^&*]{6,12}$";

    /**
     * 正則表達式:驗證手機號
     */
    String REGEX_MOBILE = "^[1][34578]\d{9}$";

    /**
     * 正則表達式:驗證郵箱
     */
    String REGEX_EMAIL = "^.+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

    /**
     * 正則表達式:驗證漢字
     */
    String REGEX_CHINESE = "^[\u4e00-\u9fa5],*$";

    /**
     * 正則表達式:驗證身份證
     */
    String REGEX_ID_CARD = "(^\d{18}$)|(^\d{15}$)";

    /**
     * 正則表達式:驗證URL
     */
    String REGEX_URL = "http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";

    /**
     * 正則表達式:驗證IP地址
     */
    String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)";

    /**
     * 車牌號正則
     */
    String LICENSE_NO = "^[京津滬渝冀豫云遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陜吉閩貴粵青藏川寧瓊使領(lǐng)A-Z][A-Z][A-Z0-9]{4,5}[A-Z0-9掛學警港澳]$";

    /**
     * 姓名校驗
     * 1~15位
     * 姓名支持空格和中文的點
     */
    String NAME = "[\u4e00-\u9fa5\u00b7\sA-Za-z]{1,15}$";

    /**
     * 表情正則
     */
    String EMOJI = "[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]";

    /**
     * 數(shù)字正則
     */
    String NUMBER = "^[0-9]*$";

    /**
     * n位的數(shù)字
     */
    String N_NUMS = "^\d{n}$";

}

SpringBoot整合hibernate-validator

引入依賴

這個不再贅述,直接拷貝上文的依賴信息

配置hibernate-validator驗證器對象

在配置類中加入hibernate-validator驗證器對象

    @Bean
    @Primary
    public Validator validator() {
        ValidatorFactory validatorFactory =
                Validation
                        .byProvider(HibernateValidator.class)
                        .configure()
                        .addProperty("hibernate.validator.fail_fast", "true")
                        .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

借助SpringMVC統(tǒng)一異常處理處理參數(shù)校驗結(jié)果

配置好后,Spring會自動幫助我們進行參數(shù)驗證,如果參數(shù)驗證不通過,會拋出BindException異常,我們剛剛手動驗證時的Set<ConstraintViolation<Person>>通過該異常獲取。

我們這可以通過借助SpringMVC統(tǒng)一異常處理的能力處理這個異常

@Slf4j
@RestControllerAdvice
public class BaseExceptionHandler {
    /**
     * spring validation 自動校驗的參數(shù)異常
     *
     * @param e BindException
     * @return R<Void>
     */
    @ResponseStatus(org.springframework.http.HttpStatus.PAYMENT_REQUIRED)
    @ExceptionHandler(BindException.class)
    public R<Void> handler(BindException e) {
        String defaultMsg = e.getBindingResult().getAllErrors()
                .stream()
                .map(ObjectError::getDefaultMessage)
                .collect(Collectors.joining(":"));
        log.warn(defaultMsg);
        return R.of(IRespCode.PARAMETERS_ANOMALIES.getCode(), e.getMessage());
    }
}

使用參數(shù)校驗

我們只需要在校驗參數(shù)的方法傳參上標注@Valid或者@Validated都行

    @PostMapping("register")
    public R<Void> register(@Valid @RequestBody Person person) {
        // todo 
        return R.ok();
    }

分組校驗

那么@Valid和@Validated有什么區(qū)別呢?

Validated比Valid多了一個屬性,這個屬性用于分組校驗使用

public @interface Valid {
}
public @interface Validated {
    Class<?>[] value() default {};
}

啥叫分組校驗?

就是一個實體類中的屬性,在不同的方法傳參中,方法的對屬性的要求不同。

比如說,Person類中有三個屬性,一個是用戶名稱,一個是郵箱,一個是年齡。

在注冊用戶接口中,用戶名稱,郵箱和年齡都不能為空,但是在更改用戶的信息接口中,用戶的年齡和郵箱都可以為空,但是用戶名稱不能為空。

這時候,我們就可以按照對屬性校驗的要求進行分組。

新建一個RegisterGroup分組,該分組只是一個空的接口,僅僅用于標記該校驗要求

public interface RegisterGroup {
}

對校驗要求進行分組

@Data
public class Person {

    @NotBlank(message = "username must not be null")
    private String username;

    @Min(value = 1, message = "age must be >= 1")
    @Max(value = 150, message = "age must be < 150")
    @NotNull(message = "age must not be null", groups = RegisterGroup.class)
    private Integer age;

    @Email(message = "email format error")
    @NotBlank(message = "email must not be null",groups = RegisterGroup.class)
    private String email;
}

方法調(diào)用時,加入分組要求

    @PostMapping("register")
    public R<Void> register(@Validated(value = RegisterGroup.class) @RequestBody Person person) {
        // todo
        return R.ok();
    }

這種方式其實不推薦使用,我在標題的時候,也已經(jīng)標記為“過時”,因為,我們完全可以為這兩個不同的接口創(chuàng)建兩個不同的實體類,而不是使用分組對校驗要求進行隔離,因為實際生產(chǎn)環(huán)境中,分組可能有非常多個,這會為我們的程序的可讀性埋下隱患,后期開發(fā)人員難以維護,而且對于自動生成API文檔也不友好。大家對于分組只需要了解即可,不建議在項目開發(fā)中使用。

總結(jié)

到此這篇關(guān)于SpringBoot參數(shù)校驗的文章就介紹到這了,更多相關(guān)SpringBoot參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)庫連接超時java處理的兩種方式

    數(shù)據(jù)庫連接超時java處理的兩種方式

    這篇文章主要介紹了數(shù)據(jù)庫連接超時java處理的兩種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MyBatis?動態(tài)SQL使用及原理

    MyBatis?動態(tài)SQL使用及原理

    這篇文章主要為大家介紹了MyBatis動態(tài)SQL使用及原理的學習詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 解決SpringBoot項目啟動成功但接口訪問404的問題

    解決SpringBoot項目啟動成功但接口訪問404的問題

    這篇文章主要介紹了如何解決SpringBoot項目啟動成功但接口訪問404的問題,具有很好的參考價值,希望對大家有所幫助,接下來就跟著小編一起來看看吧
    2023-07-07
  • SpringBoot SSO輕松實現(xiàn)(附demo)

    SpringBoot SSO輕松實現(xiàn)(附demo)

    這篇文章主要介紹了SpringBoot SSO輕松實現(xiàn)(附demo),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • java.util.Random和concurrent.ThreadLocalRandom使用對比

    java.util.Random和concurrent.ThreadLocalRandom使用對比

    這篇文章主要介紹了java.util.Random和concurrent.ThreadLocalRandom使用對比,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java的集合LinkedHashSet詳解

    Java的集合LinkedHashSet詳解

    這篇文章主要介紹了Java的集合LinkedHashSet詳解,LinkedHashSet介于HashSet和TreeSet之間,它也是一個hash表,但是同時維護了一個雙鏈表來記錄插入的順序,需要的朋友可以參考下
    2023-09-09
  • 基于Java實現(xiàn)無向環(huán)和有向環(huán)的檢測

    基于Java實現(xiàn)無向環(huán)和有向環(huán)的檢測

    這篇文章主要介紹了如何在?Java?中實現(xiàn)無向環(huán)和有向環(huán)的檢測,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,需要的可以參考一下
    2022-04-04
  • Java SpringBoot實現(xiàn)AOP

    Java SpringBoot實現(xiàn)AOP

    AOP包括連接點(JoinPoint)、切入點(Pointcut)、增強(Advisor)、切面(Aspect)、AOP代理(AOP Proxy),具體的方法和類型下面文章會舉例說明,感興趣的小伙伴和小編一起閱讀全文吧
    2021-09-09
  • java 線程之對象的同步和異步(實例講解)

    java 線程之對象的同步和異步(實例講解)

    下面小編就為大家?guī)硪黄猨ava 線程之對象的同步和異步(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • SpringMVC請求流程源碼解析

    SpringMVC請求流程源碼解析

    這篇文章主要介紹了SpringMVC請求流程源碼分析,包括springmvc使用,SpringMVC啟動過程及SpringMVC請求過程,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-07-07

最新評論

犍为县| 科尔| 巨鹿县| 定陶县| 延津县| 长宁区| 台山市| 丰原市| 铅山县| 昭觉县| 柯坪县| 凤山市| 长岭县| 淮安市| 宜春市| 娱乐| 新民市| 高青县| 长海县| 绥化市| 巨野县| 扎鲁特旗| 翁牛特旗| 南开区| 岚皋县| 余江县| 宣武区| 平凉市| 镇雄县| 内丘县| 天峨县| 喀什市| 庄河市| 宁南县| 长治市| 泾阳县| 阜宁县| 汕头市| 沙雅县| 顺平县| 呼图壁县|