1. 程式人生 > 其它 >SpringBoot校驗請求Json引數

SpringBoot校驗請求Json引數

spring boot 校驗請求json引數

在後端開發中,通過介面和引數傳輸來進行與前端互動,才可以讓一個專案成型。

由於全後端隔離的方式,所以有時候需要不那麼信任前端,也就是在驗證當前操作是否有許可權同時,校驗前端傳來的引數的合理性也是必不可少的。

這裡只記錄post json資料時候的校驗方法。


以下程式碼中使用到的依賴,以及工具類,在結果的git連結中可以找到


  1. 一般的校驗方法

    程式碼:

    // 測試介面
    @RestController
    @RequestMapping("/simple")
    public class SimpleController {
    
        // 開發中建議另外定義一個類來接受=收
        // 可以使用內部類, 不過不要寫太多
        @Data
        private static class TestParam {
            private int num;
            private String str;
        }
    
        @PostMapping("/test")
        public R<?> test(@RequestBody(required = false) TestParam param) {
    
            if (StringUtils.isNull(param)
                    || StringUtils.isEmpty(param.getStr()) || param.getNum() <= 0) {
               return R.paramErr();
            }
    
            // TODO 邏輯處理
    
            return R.ok(new JSONObject());
        }
    }
    

    測試引數:

    {
    
    }
    or
    {
        "str": 1
    }
    or
    {
        "num": 2
    }
    

    結果:

    {
        "code": "1001",
        "msg": "引數格式錯誤",
        "data": null
    }
    

    結果以及分析:

    • 表述不清楚,不管是缺少,還是不符合格式,全部返回格式錯誤(單獨判斷很冗餘)。
    • 在str傳輸數字時候可以通過(給數字型別傳純字串的處理方法在2.2第二個處理器
  2. 接下來記錄springboot提供的引數校驗註解

    1. 引數註解

      @Data
      private static class TestParam {
          @NotNull(message = "缺少數字引數")
          private int num;
          @NotNull(message = "缺少字串引數")
          private String str;
      
          @NotNull(message = "物件引數不能為空")
          @Valid
          private String a;
      }
      
      @Data
      public static class TestObjParam {
          @NotNull(message = "物件引數內,引數不能為空")
          // 若還有內部物件,繼續使用 @Valid 註解即可
          private String param;
      }
      
      /**
       * 測試驗證引數
       */
      @PostMapping(value = "/test")
      Object test(@RequestBody @Validated TestParam param) {
          return "通過測試";
      }
      
    2. 與之配套使用的

      @RestControllerAdvice
      public class ControllerAdvice {
      
          /**
           * 攔截JSON引數校驗
           */
          @ResponseStatus(HttpStatus.OK)
          @ExceptionHandler(MethodArgumentNotValidException.class)
          public Map<String, String> bindException(MethodArgumentNotValidException e) {
      
              BindingResult bindingResult = e.getBindingResult();
      
              String msg = Objects.requireNonNull(
                  bindingResult.getFieldError()).getDefaultMessage();
      
              Map<String, String> result = new HashMap<>();
      
              result.put("code", "1001");
              result.put("msg", msg);
              result.put("data", null);
      
              return result;
          }
          
          /**
           * 攔截型別不匹配。也即需要欄位傳物件,數字傳字串和物件的情況
           */
          @ResponseStatus(HttpStatus.OK)
          @ExceptionHandler(HttpMessageNotReadableException.class)
          public R<?> bindException(HttpMessageNotReadableException e) {
      
              return R.paramErr("引數中有不符合目標格式的");
          }
      }
      
    3. 結果分析

      • 大大減少了在進行邏輯開發前的手動引數校驗
      • 同時前端在對介面時候也可以準確地清楚引數缺少和不符合要求的情況。
  3. 常用的引數,完整版可以在包javax.validation.constraints

    註解
    @NotNull 被註解的元素不能為null 修飾所有型別引數
    @NotEmpty 不能為空 陣列
    @Min(value) 被註解元素的最小值等於value 數字型別
    @Max(value) 被註解的元素的最大值等於value 數字型別
    @Size(max, min) 範圍註解
    @Pattern(value) 正則表示式做鑑定
  4. git地址: springboot-param-validate

  5. 參考資料: