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

SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗的示例

 更新時間:2020年09月08日 09:28:39   作者:溪源的奇思妙想  
這篇文章主要介紹了SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

我們在開發(fā)Java項目的時候,經(jīng)常需要對參數(shù)進(jìn)行一些必填項、格式、長度等進(jìn)行校驗,如果手寫代碼對參數(shù)校驗,每個接口會需要很多低級的代碼,這樣會降低代碼的可讀性。那么我們能不能使用一種比較優(yōu)雅的方式來實(shí)現(xiàn),對請求中的參數(shù)進(jìn)行校驗?zāi)兀?/p>

knife4j的安裝與使用可參考我的博客:SpringBoot使用knife4j進(jìn)行在線接口調(diào)試

正文

ValidationApi框架就是用來解決參數(shù)校驗中代碼冗余問題,ValidationApi框架提供一些注解用來幫助我們對請求參數(shù)進(jìn)行校驗:

SpringBoot使用validation-api實(shí)現(xiàn)參數(shù)校驗

注入依賴

<!--參數(shù)校驗-->
<dependency>
  <groupId>javax.validation</groupId>
  <artifactId>validation-api</artifactId>
  <version>2.0.1.Final</version>
</dependency>

<!--提供一些字符串操作-->
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
  <version>3.3.2</version>
</dependency>

<!--lombok-->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.2</version>
  <optional>true</optional>
</dependency>

<!--knife4j接口-->
<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-spring-boot-starter</artifactId>
  <version>2.0.4</version>
</dependency>

UserPojoReq.java請求封裝類

如果成員變量是其他對象實(shí)體,該變量必須加 @Valid,否則嵌套中的驗證不生效

@Setter
@Getter
@ToString
@ApiModel("用戶對象")
public class UserPojoReq extends Request implements Serializable {
  private static final long serialVersionUID = -354657839724457905L;

  @ApiModelProperty(required = true, notes = "主鍵", example = "123")
  private String id;

  @ApiModelProperty(required = true, notes = "用戶名", example = "luo")
  @NotNull(message = "用戶姓名為必填項,不得為空")
  @Size(min = 2,max = 20,message = "用戶名長度要在2—8個字符")
  private String name;

  @ApiModelProperty(required = true, notes = "消息", example = "消息")
  private String msg;

}

CouponTypeEnum.class :錯誤碼枚舉類

@Getter
public enum CouponTypeEnum {

  PARAMETER_ERROR(1001, "請求參數(shù)有誤!"),
  UNKNOWN_ERROR(9999, "未知的錯誤!”);

  /**
   * 狀態(tài)值
   */
  private int couponType;


  /**
   * 狀態(tài)描述
   */
  private String couponTypeDesc;

  CouponTypeEnum(int couponType, String couponTypeDesc){
    this.couponType = couponType;
    this.couponTypeDesc = couponTypeDesc;
  }

  public static String getDescByType(int couponType) {
    for (CouponTypeEnum type : CouponTypeEnum.values()) {
      if (type.couponType == couponType) {
        return type.couponTypeDesc;
      }
    }
    return null;
  }


  public String getcouponTypeStr(){
    return String.valueOf(this.couponType);
  }
}

BusinessException.java:自定義業(yè)務(wù)異常類

/**
 * 業(yè)務(wù)自定義異常
 */
@Getter
public class BusinessException extends RuntimeException {

  private static final long serialVersionUID = -1895174013651345407L;
  private final CouponTypeEnum errorCode;
  private String primaryErrorCode;
  private String primaryErrorMsg;
  private String primaryErrorIP;

  public BusinessException(CouponTypeEnum errorCode) {
    this(errorCode, errorCode.getCouponTypeDesc());
  }
  public BusinessException(CouponTypeEnum errorCode, String message) {
    super(message);
    this.errorCode = errorCode;
  }
  public BusinessException(CouponTypeEnum errorCode, String message,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) {
    super(message);
    this.errorCode = errorCode;
    this.primaryErrorCode=primaryErrorCode;
    this.primaryErrorMsg=primaryErrorMsg;
    this.primaryErrorIP=primaryErrorIP;
  }
  public BusinessException(CouponTypeEnum errorCode,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) {
    this(errorCode, errorCode.getCouponTypeDesc());
    this.primaryErrorCode=primaryErrorCode;
    this.primaryErrorMsg=primaryErrorMsg;
    this.primaryErrorIP=primaryErrorIP;
  }

}

GlobalExceptionHandler.class 攔截異常并統(tǒng)一處理

  1. MissingServletRequestParameterException:必填項為null異常
  2. HttpMessageNotReadableException:參數(shù)類型不匹配異常
  3. MethodArgumentNotValidException:JSON校驗失敗異常(比如長度等)
  4. BusinessException:自定義的異常
  5. Exception:其他異常
@RestControllerAdvice("com.luo.producer.controller")
@Slf4j
public class GlobalExceptionHandler {
  
  
  /**
   * 忽略參數(shù)異常處理器
   *
   * @param e 忽略參數(shù)異常
   * @return Response
   */
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ExceptionHandler(MissingServletRequestParameterException.class)
  public Response parameterMissingExceptionHandler(MissingServletRequestParameterException e) {
    log.error("", e);
    return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "請求參數(shù) " + e.getParameterName() + " 不能為空");
  }


  /**
   * 缺少請求體異常處理器
   *
   * @param e 缺少請求體異常
   * @return Response
   */
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ExceptionHandler(HttpMessageNotReadableException.class)
  public Response parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) {
    log.error("", e);
    return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), "參數(shù)體不能為空");
  }


  /**
   * 參數(shù)效驗異常處理器
   *
   * @param e 參數(shù)驗證異常
   * @return ResponseInfo
   */
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ExceptionHandler(MethodArgumentNotValidException.class)
  public Response parameterExceptionHandler(MethodArgumentNotValidException e) {
    log.error("", e);
    // 獲取異常信息
    BindingResult exceptions = e.getBindingResult();
    // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
    if (exceptions.hasErrors()) {
      List<ObjectError> errors = exceptions.getAllErrors();
      if (!errors.isEmpty()) {
        // 這里列出了全部錯誤參數(shù),按正常邏輯,只需要第一條錯誤即可
        FieldError fieldError = (FieldError) errors.get(0);
        return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage());
      }
    }
    return new Response(CouponTypeEnum.PARAMETER_ERROR);
  }


  /**
   * 自定義參數(shù)錯誤異常處理器
   *
   * @param e 自定義參數(shù)
   * @return ResponseInfo
   */
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ExceptionHandler({BusinessException.class})
  public Response paramExceptionHandler(BusinessException e) {
    log.error("", e);
    // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
    if (!StringUtils.isEmpty(e.getMessage())) {
      return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), e.getMessage());
    }
    return new Response(CouponTypeEnum.PARAMETER_ERROR);
  }


  /**
   * 其他異常
   *
   * @param e
   * @return
   */
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  @ExceptionHandler({Exception.class})
  public Response otherExceptionHandler(Exception e) {
    log.error("其他異常", e);
    // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息
    if (!StringUtils.isEmpty(e.getMessage())) {
      return new Response(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage());
    }
    return new Response(CouponTypeEnum.UNKNOWN_ERROR);
  }
}

驗證

測試接口

@Valid被標(biāo)記的實(shí)體將會開啟一個校驗的功能

@RequestBody:請求實(shí)體需要加上@RequestBody否則MethodArgumentNotValidException異常將會被識別成Exception異常,提示信息將與預(yù)期不符。

@RestController
@Slf4j
public class UserController {

  @PostMapping("/helloluo")
  @MyPermissionTag(value = "true")
  public String helloluo(@RequestBody @Valid UserPojoReq userPojoReq){
    return "Hello World”+userPojoReq;
  }
}

模擬請求參數(shù),進(jìn)行接口訪問:

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

相關(guān)文章

  • Java使用Filter實(shí)現(xiàn)登錄驗證

    Java使用Filter實(shí)現(xiàn)登錄驗證

    本文主要介紹了Java使用Filter實(shí)現(xiàn)登錄驗證,Filter類似于門衛(wèi),你在進(jìn)入之前門衛(wèi)需要盤查你,身份合法進(jìn)入,身份不合法攔截,感興趣的可以了解一下
    2023-11-11
  • java大話之創(chuàng)建型設(shè)計模式教程示例

    java大話之創(chuàng)建型設(shè)計模式教程示例

    這篇文章主要為大家介紹了java大話之創(chuàng)建型設(shè)計模式教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java中Iterator與ListIterator迭代的區(qū)別

    Java中Iterator與ListIterator迭代的區(qū)別

    本文主要介紹了Java中Iterator與ListIterator迭代的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 面試JAVA時,問到spring該怎么回答

    面試JAVA時,問到spring該怎么回答

    這篇文章主要介紹了Spring面試資料,學(xué)Java的小伙伴都知道Spring是面試的必問環(huán)節(jié),看完了一天就可掌握數(shù)據(jù)結(jié)構(gòu)和算法的面試題,快來看看吧
    2021-08-08
  • Java淺析枚舉類的使用

    Java淺析枚舉類的使用

    枚舉類型可以取代以往常量的定義方式,即將常量封裝在類或接口中。此外,枚舉類型還提供了安全檢查功能。本文就來和大家講講Java中枚舉類的用法,需要的可以參考一下
    2022-07-07
  • 新手初學(xué)Java數(shù)組

    新手初學(xué)Java數(shù)組

    數(shù)組是相同類型數(shù)據(jù)的有序集合數(shù)組描述的是相同類型的若干個數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個數(shù)據(jù)稱作一個數(shù)組元素,每個數(shù)組元素可以通過一個下標(biāo)來訪問它們數(shù)組的聲明創(chuàng)建
    2021-07-07
  • springcloud-gateway整合jwt+jcasbin實(shí)現(xiàn)權(quán)限控制的詳細(xì)過程

    springcloud-gateway整合jwt+jcasbin實(shí)現(xiàn)權(quán)限控制的詳細(xì)過程

    這篇文章主要介紹了springcloud-gateway整合jwt+jcasbin實(shí)現(xiàn)權(quán)限控制,基于springboot+springcloud+nacos的簡單分布式項目,項目交互采用openFeign框架,單獨(dú)提取出來成為一個獨(dú)立的model,需要的朋友可以參考下
    2023-02-02
  • Java深入探究Object類的方法

    Java深入探究Object類的方法

    java繼承中說到的Object類是java中一個特殊的類,所有的類都是直接或者間接的繼承自O(shè)bject類,即如果某個類沒有使用extends關(guān)鍵字則默認(rèn)是java.lang.Object類的子類,所以所有的類都可以使用Object類中定義的方法,下面介紹Object類的常用方法
    2022-05-05
  • springboot為異步任務(wù)規(guī)劃自定義線程池的實(shí)現(xiàn)

    springboot為異步任務(wù)規(guī)劃自定義線程池的實(shí)現(xiàn)

    本文主要介紹了springboot為異步任務(wù)規(guī)劃自定義線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java中文件管理系統(tǒng)FastDFS詳解

    Java中文件管理系統(tǒng)FastDFS詳解

    這篇文章主要介紹了Java中文件管理系統(tǒng)FastDFS詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論

大埔县| 高台县| 隆林| 法库县| 四平市| 友谊县| 大渡口区| 揭西县| 东乌珠穆沁旗| 广河县| 珠海市| 灵石县| 孝昌县| 任丘市| 吉水县| 西畴县| 青州市| 聂拉木县| 仁怀市| 张掖市| 涡阳县| 青海省| 大渡口区| 宁南县| 荆州市| 新乡市| 广州市| 麦盖提县| 呼图壁县| 麻城市| 如东县| 高邑县| 大姚县| 武乡县| 封丘县| 修水县| 乌拉特前旗| 昌吉市| 天门市| 临猗县| 保亭|