天天看點

SpringBoot參數校驗

一 校驗簡單資料類型

SpringBoot參數校驗

SpringBoot自帶了validation工具可以從後端對前端傳來的參數進行校驗,用法如下:

  1. 引入validation起步依賴
<!-- 參數校驗 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>      
  1. 編寫Controller
// 該控制器開啟參數校驗
@Validated
@Controller
public class TestController {
  @RequestMapping("/t1")
  @ResponseBody
  // 在參數前加校驗注解,該注解的意思是字元串參數不能為null
  public String t1(@NotBlank String username){
    System.out.println(username);
    return "請求成功!";
   }
}      
  1. 通路http://localhost:8080/t1,發現當沒有傳來參數時,會抛出ConstraintViolationException異常。
  2. 在校驗參數的注解中添加message屬性,可以替換異常資訊。
// 該控制器開啟參數校驗
@Validated
@Controller
public class TestController {
  @RequestMapping("/t1")
  @ResponseBody
  // 在參數前加校驗注解,該注解的意思是字元串參數不能為null
  public String t1(@NotBlank(message = "使用者名不能為空") String username){
    System.out.println(username);
    return "請求成功!";
   }
}      

二 校驗異常處理

SpringBoot參數校驗

當抛出ConstraintViolationException異常後,我們可以使用SpringMVC的異常處理器,也可以使用SpringBoot自帶的異常處理機制。

當程式出現了異常,SpringBoot會使用自帶的BasicErrorController對象處理異常。該處理器會預設跳轉到/resources/templates/error.html頁面。

編寫異常頁面:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>錯誤頁面</title>
</head>
<body>
<h1>伺服器開小差了!</h1>
</body>
</html>      

三 校驗校驗相關注解

@NotNull 判斷包裝類是否為null

@NotBlank 判斷字元串是否為null或者是空串(去掉首尾空格)

@NotEmpty 判斷集合是否為空

@Length 判斷字元的長度(最大或者最小)

@Min 判斷數值最小值

@Max 判斷數值最大值

@Email 判斷郵箱是否合法

@RequestMapping("/t2")
@ResponseBody
public String t2(
    @NotBlank @Length(min = 1, max = 5) String username,
    @NotNull @Min(0) @Max(150) Integer age,
    @NotEmpty @RequestParam List<String> address,
    @NotBlank @Email String email) {
  System.out.println(username);
  System.out.println(age);
  System.out.println(address);
  System.out.println(email);
  return "請求成功!";
}      

四 校驗對象類型

SpringBoot參數校驗
  1. 添加實體類
public class Student {
  @NotNull(message = "id不能為空")
  private Integer id;
  @NotBlank(message = "姓名不能為空")
  private String name;
  // 省略getter/setter/tostring
}      
  1. 編寫控制器
@Controller
public class TestController2 {
  @RequestMapping("/t3")
  @ResponseBody
  // 校驗的對象參數前添加@Validated,并将異常資訊封裝到BindingResult對象中
  public String t3(@Validated Student student,BindingResult result) {
    // 判斷是否有參數異常
    if (result.hasErrors()) {
      // 所有參數異常
      List<ObjectError> list = result.getAllErrors();
      // 周遊參數異常,輸出異常資訊
      for (ObjectError err : list) {
        FieldError fieldError = (FieldError) err;
        System.out.println(fieldError.getDefaultMessage());
       }
      return "參數異常";
     }
    System.out.println(student);
    return "請求成功!";
   }
}