中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Boot項目傳參校驗的方法

發布時間:2022-04-06 10:25:41 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

這篇文章主要講解了“Spring Boot項目傳參校驗的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring Boot項目傳參校驗的方法”吧!

場景還原

簡單業務場景模擬:

假如你現在在做一個成績錄入系統,你愉快地用Spring Boot框架寫了一個后臺接口,用于接收前臺瀏覽器傳過來的 Student對象,并插入后臺數據庫。

我們將傳入的 Student對象定義為:

public class Student {
    private String name;    // 姓名
    private Integer score;  // 考試分數(滿分100分)
    private String mobile;  // 電話號碼(11位)
}

然后寫一個Post請求的后臺接口,來接收網頁端傳過來的 Student對象:

@RestController
public class TestController {

    @Autowired
    private StudentService studentService;

    @PostMapping("/add")
    public String addStudent( @RequestBody Student student ) {
        studentService.addStudent( student ); // 將student對象存入數據庫
        return "SUCCESS";
    }
}

此時我想你一定看出來了上面這段代碼的漏洞,因為我們并沒有對傳入的 Student對象做任何數據校驗,比如:

Student對象里三個字段的某一個忘傳了,為 null怎么辦?Student的 score分數,假如寫錯了,寫成 101分怎么辦?Student的 mobile11位手機號碼,假如填錯了,多寫了一位怎么辦?...等等

這些數據雖然在前端頁面一般會做校驗,但我們作為一個嚴謹且良心的后端開發工程師,我們肯定要對傳入的每一項數據做嚴格的校驗,所以我們應該怎么寫?

@PostMapping("/add")
public String addStudent( @RequestBody Student student ) {
    if( student == null )
        return "傳入的Student對象為null,請傳值";
    if( student.getName()==null || "".equals(student.getName()) )
        return "傳入的學生姓名為空,請傳值";
    if( student.getScore()==null )
        return "傳入的學生成績為null,請傳值";
    if( (student.getScore()<0) || (student.getScore()>100) )
        return "傳入的學生成績有誤,分數應該在0~100之間";
    if( student.getMobile()==null || "".equals(student.getMobile()) )
        return "傳入的學生電話號碼為空,請傳值";
    if( student.getMobile().length()!=11 )
        return "傳入的學生電話號碼長度有誤,應為11位";
    studentService.addStudent( student ); // 將student對象存入MySQL數據庫
    return "SUCCESS";
}

寫是寫完了,就是感覺手有點酸,并且心有點累,這個 Student對象倒還好,畢竟內部僅3個字段,假如一個復雜的對象有30個字段怎么辦?簡直不敢想象!

神注解加持

其實Spring框架很早版本開始,就通過注解的方式,來方便地為我們提供了各項交互數據的校驗工作,比如上面的例子,我們只需要在傳入的 Student實體類的字段中加入對應注解即可方便的解決問題:

public class Student {
    @NotNull(message = "傳入的姓名為null,請傳值")
    @NotEmpty(message = "傳入的姓名為空字符串,請傳值")
    private String name;    // 姓名

    @NotNull(message = "傳入的分數為null,請傳值")
    @Min(value = 0,message = "傳入的學生成績有誤,分數應該在0~100之間")
    @Max(value = 100,message = "傳入的學生成績有誤,分數應該在0~100之間")
    private Integer score;  // 分數

    @NotNull(message = "傳入的電話為null,請傳值")
    @NotEmpty(message = "傳入的電話為空字符串,請傳值")
    @Length(min = 11, max = 11, message = "傳入的電話號碼長度有誤,必須為11位")
    private String mobile;  // 電話號碼
}

當然,于此同時,我們還需要在對象入口處,加上注解 @Valid來開啟對傳入 Student對象的驗證工作:

@PostMapping("/add")
public String addStudent( @RequestBody  @Valid Student student ) {
    // 棒棒噠!原先各種繁雜的參數校驗工作統統都省了!一行代碼不用寫
    studentService.addStudent( student ); // 將student對象存入MySQL數據庫
    return "SUCCESS";
}

這時候,如果某個字段傳入錯誤,比如我傳數據的時候,將學生的成績誤傳為 101分,則接口返回結果便會提示出錯誤詳情:

Spring?Boot項目傳參校驗的方法

當然,關于這個事情的原理,既然用到了注解,無非用的也就是Java里的各種反射等知識來實現的,感興趣的小伙伴可以借此機會研究一下!

數據異常統一攔截

上面利用注解的方式做統一數據校驗感覺十分美好,但唯一美中不足的就是返回的結果太過繁雜,不一定使我們需要的格式,我們需要做統一處理,比如:我只想將具體參數校驗的錯誤提示信息給摳出來返回給前端即可。

為此,我們為項目配置全局統一異常攔截器來格式化所有數據校驗的返回結果。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionInterceptor {
  @ExceptionHandler(value = Exception.class)
  public String exceptionHandler(HttpServletRequest request, Exception e) {
    String failMsg = null;
    if (e instanceof MethodArgumentNotValidException) {
      // 拿到參數校驗具體異常信息提示
      failMsg = ((MethodArgumentNotValidException) e).getBindingResult().getFieldError().getDefaultMessage();
    }
    return failMsg; // 直接吐回給前端
  }
}

如上面代碼所示,我們全局統一攔截了參數校驗異常 MethodArgumentNotValidException,并僅僅只拿到對應異常的詳細 Message信息吐給前端,此時返回給前端的數據就清楚得多:

Spring?Boot項目傳參校驗的方法

感謝各位的閱讀,以上就是“Spring Boot項目傳參校驗的方法”的內容了,經過本文的學習后,相信大家對Spring Boot項目傳參校驗的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长治县| 湘阴县| 岳阳市| 和静县| 龙江县| 武威市| 海原县| 阳朔县| 樟树市| 维西| 怀化市| 静安区| 秦安县| 齐齐哈尔市| 武安市| 泰兴市| 横山县| 三明市| 长沙县| 射洪县| 德钦县| 博湖县| 三江| 宁波市| 浦江县| 定远县| 金华市| 乐清市| 邯郸市| 长武县| 正宁县| 水富县| 潢川县| 德安县| 大姚县| 临沭县| 东乡族自治县| 海盐县| 伽师县| 衡南县| 宁陕县|