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

SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法

 更新時間:2019年12月16日 12:00:28   作者:TopJavaer  
這篇文章主要介紹了SpringBoot如何優(yōu)雅的處理校驗參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

做web開發(fā)有一點很煩人就是要校驗參數(shù),基本上每個接口都要對參數(shù)進行校驗,比如一些格式校驗 非空校驗都是必不可少的。如果參數(shù)比較少的話還是容易 處理的一但參數(shù)比較多了的話代碼中就會出現(xiàn)大量的IF ELSE就比如下面這樣:

 

這個例子只是校驗了一下空參數(shù)。如果需要驗證郵箱格式和手機號格式校驗的話代碼會更多,所以介紹一下validator通過注解的方式進行校驗參數(shù)。

什么是Validator

Bean Validation是Java定義的一套基于注解的數(shù)據(jù)校驗規(guī)范,目前已經(jīng)從JSR 303的1.0版本升級到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已經(jīng)經(jīng)歷了三個版本 。在SpringBoot中已經(jīng)集成在 starter-web中,所以無需在添加其他依賴。

注解介紹

validator內(nèi)置注解

注解

詳細信息

@Null

被注釋的元素必須為 null

@NotNull

被注釋的元素必須不為 null

@AssertTrue

被注釋的元素必須為 true

@AssertFalse

被注釋的元素必須為 false

@Min(value)

被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@Max(value)

被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@DecimalMin(value)

被注釋的元素必須是一個數(shù)字,其值必須大于等于指定的最小值

@DecimalMax(value)

被注釋的元素必須是一個數(shù)字,其值必須小于等于指定的最大值

@Size(max, min)

被注釋的元素的大小必須在指定的范圍內(nèi)

@Digits (integer, fraction)

被注釋的元素必須是一個數(shù)字,其值必須在可接受的范圍內(nèi)

@Past

被注釋的元素必須是一個過去的日期

@Future

被注釋的元素必須是一個將來的日期

@Pattern(value)

被注釋的元素必須符合指定的正則表達式

Hibernate Validator 附加的 constraint

注解

詳細信息

@Email

被注釋的元素必須是電子郵箱地址

@Length

被注釋的字符串的大小必須在指定的范圍內(nèi)

@NotEmpty

被注釋的字符串的必須非空

@Range

被注釋的元素必須在合適的范圍內(nèi)

@NotBlank

驗證字符串非null,且長度必須大于0

注意:

  • @NotNull 適用于任何類型被注解的元素必須不能與NULL
  • @NotEmpty 適用于String Map或者數(shù)組不能為Null且長度必須大于0
  • @NotBlank 只能用于String上面 不能為null,調(diào)用trim()后,長度必須大于0

使用

使用起來也非常簡單,下面略過創(chuàng)建項目

模擬用戶注冊封裝了一個UserDTO

當提交數(shù)據(jù)的時候如果使用以前的做法就是IF ELSE判斷參數(shù)使用validator則是需要增加注解即可。

例如非空校驗:

然后需要在controller方法體添加@Validated不加@Validated校驗會不起作用

然后請求一下請求接口,把Email參數(shù)設置為空

參數(shù):

{
  "userName":"luomengsun",
  "mobileNo":"11111111111",
  "sex":1,
  "age":21,
  "email":""
}

返回結(jié)果:

后臺拋出異常

這樣是能校驗成功,但是有個問題就是返回參數(shù)并不理想,前端也并不容易處理返回參數(shù),所以我們添加一下全局異常處理,然后添加一下全局統(tǒng)一返回參數(shù)這樣比較規(guī)范。

添加全局異常

創(chuàng)建一個GlobalExceptionHandler類,在類上方添加@RestControllerAdvice注解然后添加以下代碼:

  /**
   * 方法參數(shù)校驗
   */
@ExceptionHandler(MethodArgumentNotValidException.class)
public ReturnVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    log.error(e.getMessage(), e);
    return new ReturnVO().error(e.getBindingResult().getFieldError().getDefaultMessage());
  }

此方法主要捕捉MethodArgumentNotValidException異常然后對異常結(jié)果進行封裝,如果需要在自行添加其他異常處理。

添加完之后我們在看一下運行結(jié)果,調(diào)用接口返回:

{
  "code": "9999",
  "desc": "郵箱不能為空",
  "data": null
}

OK 已經(jīng)對異常進行處理。

校驗格式

如果想要校驗郵箱格式或者手機號的話也非常簡單。

校驗郵箱

  /**
   * 郵箱
   */
  @NotBlank(message = "郵箱不能為空")
  @NotNull(message = "郵箱不能為空")
  @Email(message = "郵箱格式錯誤")
  private String email;

使用正則校驗手機號

校驗手機號使用正則進行校驗,然后限制了一下位數(shù)

  /**
   * 手機號
   */
  @NotNull(message = "手機號不能為空")
  @NotBlank(message = "手機號不能為空")
  @Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手機號格式有誤")
  @Max(value = 11,message = "手機號只能為{max}位")
  @Min(value = 11,message = "手機號只能為{min}位")
  private String mobileNo;

查看一下運行結(jié)果

傳入?yún)?shù):

{
  "userName":"luomengsun",
  "mobileNo":"111111a",
  "sex":1,
  "age":21,
  "email":"1212121"
}

返回結(jié)果:

{
  "code": "9999",
  "desc": "郵箱格式錯誤",
  "data": null
}

這里不再驗證手機號的例子

自定義注解

上面的注解只有這么多,如果有特殊校驗的參數(shù)我們可以使用Validator自定義注解進行校驗

首先創(chuàng)建一個IdCard注解類

@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdCardValidator.class)
public @interface IdCard {

  String message() default "身份證號碼不合法";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

}

在UserDTO中添加@IdCard注解即可驗證,在運行時觸發(fā),本文不對自定義注解做過多的解釋,下篇文章介紹自定義注解

  • message 提示信息
  • groups 分組
  • payload 針對于Bean

然后添加IdCardValidator 主要進行驗證邏輯

上面調(diào)用了is18ByteIdCardComplex方法,傳入?yún)?shù)就是手機號,驗證身份證規(guī)則自行百度

然后使用

  @NotNull(message = "身份證號不能為空")
  @IdCard(message = "身份證不合法")
  private String IdCardNumber;

分組

就比如上面我們定義的UserDTO中的參數(shù)如果要服用的話怎么辦?

在重新定義一個類然后里面的參數(shù)要重新添加注解?

Validator提供了分組方法完美了解決DTO服用問題

現(xiàn)在我們注冊的接口修改一下規(guī)則,只有用戶名不能為空其他參數(shù)都不進行校驗

先創(chuàng)建分組的接口

public interface Create extends Default {
}

我們只需要在注解加入分組參數(shù)即可例如:

 

 /**
   * 用戶名
   */
  @NotBlank(message = "用戶姓名不能為空",groups = Create.class)
  @NotNull(message = "用戶姓名不能為空",groups = Create.class)
  private String userName;

  @NotBlank(message = "郵箱不能為空",groups = Update.class)
  @NotNull(message = "郵箱不能為空",groups = Update.class)
  @Email(message = "郵箱格式錯誤",groups = Update.class)
  private String email;

然后在修改Controller在@Validated中傳入Create.class

  @PostMapping("/user")
  public ReturnVO userRegistra(@RequestBody @Validated(Create.class) UserDTO userDTO){
    ReturnVO returnVO = userService.userRegistra(userDTO);
    return returnVO ;
  }

然后調(diào)用傳入?yún)?shù):

{
  "userName":"",
}

返回參數(shù):

{
  "code": "9999",
  "desc": "用戶姓名不能為空",
  "data": null
}

OK 現(xiàn)在只對Create的進行校驗,而Updata組的不校驗,如果需要復用DTO的話可以使用分組校驗

校驗單個參數(shù)

在開發(fā)的時候一定遇到過單個參數(shù)的情況,在參數(shù)前面加上注解即可

  @PostMapping("/get")
  public ReturnVO getUserInfo(@RequestParam("userId") @NotNull(message = "用戶ID不能為空") String userId){
    return new ReturnVO().success();
  }

然后在Controller類上面增加@Validated注解,注意不是增加在參數(shù)前面。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Map如何根據(jù)key指定條件進行過濾篩選

    Map如何根據(jù)key指定條件進行過濾篩選

    這篇文章主要介紹了Map如何根據(jù)key指定條件進行過濾篩選問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java 注解的使用實例詳解

    Java 注解的使用實例詳解

    這篇文章主要介紹了Java 注解的使用實例詳解的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java的List集合框架之LinkedList詳細解析

    Java的List集合框架之LinkedList詳細解析

    這篇文章主要介紹了Java的List集合框架之LinkedList詳細解析,LinkedList底層是內(nèi)部Node類的存儲,prev、next、item值,同時最外層還有first、last節(jié)點,需要的朋友可以參考下
    2023-11-11
  • Java中的ThreadLocalMap源碼解讀

    Java中的ThreadLocalMap源碼解讀

    這篇文章主要介紹了Java中的ThreadLocalMap源碼解讀,ThreadLocalMap是ThreadLocal的內(nèi)部類,是一個key-value數(shù)據(jù)形式結(jié)構(gòu),也是ThreadLocal的核心,需要的朋友可以參考下
    2023-09-09
  • java排序去重示例分享

    java排序去重示例分享

    這篇文章主要介紹了java排序去重示例,對String strs = "ZZZ BBB AAA OOO ZZZ AAA ZZZ"計算出現(xiàn)個數(shù),排序去重,需要的朋友可以參考下
    2014-02-02
  • Spring底層原理深入分析

    Spring底層原理深入分析

    Spring框架是一個開放源代碼的J2EE應用程序框架,由Rod Johnson發(fā)起,是針對bean的生命周期進行管理的輕量級容器(lightweight container)。 Spring解決了開發(fā)者在J2EE開發(fā)中遇到的許多常見的問題,提供了功能強大IOC、AOP及Web MVC等功能
    2022-07-07
  • 深入理解happens-before和as-if-serial語義

    深入理解happens-before和as-if-serial語義

    本文大部分整理自《Java并發(fā)編程的藝術(shù)》,溫故而知新,加深對基礎的理解程度。下面可以和小編來一起學習下
    2019-05-05
  • Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)

    Java輕松掌握面向?qū)ο蟮娜筇匦苑庋b與繼承和多態(tài)

    本文主要講述的是面向?qū)ο蟮娜筇匦裕悍庋b,繼承,多態(tài),內(nèi)容含括從封裝到繼承再到多態(tài)的所有重點內(nèi)容以及使用細節(jié)和注意事項,內(nèi)容有點長,請大家耐心看完
    2022-05-05
  • java 非對稱加密算法RSA實現(xiàn)詳解

    java 非對稱加密算法RSA實現(xiàn)詳解

    這篇文章主要介紹了java 非對稱加密算法RSA實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java 并發(fā)編程之ThreadLocal詳解及實例

    Java 并發(fā)編程之ThreadLocal詳解及實例

    這篇文章主要介紹了Java 并發(fā)編程之ThreadLocal詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評論

华阴市| 玉门市| 沁阳市| 通化市| 宁强县| 邳州市| 泸水县| 沂水县| 麻阳| 新乐市| 双牌县| 湟中县| 宁海县| 丹江口市| 津南区| 洞头县| 碌曲县| 吉林市| 射阳县| 嘉祥县| 临澧县| 防城港市| 察隅县| 丽江市| 江达县| 墨江| 南涧| 宜宾县| 来宾市| 晋宁县| 石渠县| 贵港市| 阳新县| 柘城县| 井冈山市| 修水县| 平阳县| 米易县| 正阳县| 罗平县| 南涧|