參數校驗的必要性千篇一律,就不在多言了。
快速開始
1、引入jar包
springboot項目中引入jar包(有了springboot就是好,jsr303直接成了一個starter,不用再去擔心版本,jar包不對什麼的了)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、簡單的示例
-->構造一個簡單的POJO用于接收參數
public class UserVO implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank(message = "name不能為空")
private String name;
@NotNull(message = "年齡不能為空")
@Min(value = 18, message = "未成年人禁止通路")
private Integer age;
//省略get/set.....
}
-->controller
@Controller
@RequestMapping("/test")
public class TestController {
/**
* <p>jsr303測試
* */
@RequestMapping(value = "/jsr303test")
@ResponseBody
public String jsr303Test(@Valid UserVO userVO, BindingResult result) {
// 參數校驗
if(result.hasErrors()) {
List<FieldError> errors = result.getFieldErrors();
Map<String, Object> map = new HashMap<>();
for(FieldError error : errors) {
map.put(error.getField(), error.getDefaultMessage());
}
return map.toString();
}
return "校驗通過,處理點其它的業務吧..";
}
}
-->測試及結果

json接收參數同樣支援
現身說法
1、@Valid隻能校驗用POJO作為參數接收對象,參數傳遞方式可以是json;
2、單個參數驗證
@NotNull(message = "id不能為空")Long id
3、JSR303的校驗結果都封裝在接口BindingResult中,BindingResult必須緊跟在被@Valid注解的參數後面;
反例:
BindingResult沒有緊跟在@Valid注解的參數後面;
4、需要校驗的POJO屬性,可以加入多個校驗;
5、建議使用包裝類替代基本資料類型,基本資料類型沒有注解支援非空判斷;
注解大全
注解 | 說明 |
@Null | 被注解的屬性必須為Null |
@NotNull | 驗證對象是否不為null, 無法查檢長度為0的字元串 |
@NotBlank | 檢查限制字元串是不是Null還有被Trim的長度是否大于0,隻對字元串,且會去掉前後空格,适用String |
@NotEmpty | 檢查限制元素是否為NULL或者是EMPTY,适用集合 |
@AssertTrue | 驗證 Boolean 對象是否為 true |
@AssertFalse | 驗證 Boolean 對象是否為 false |
@Size(min=, max=) | 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之内 |
@Length | 被注解的字元串長度 |
@Past | 驗證 Date 和 Calendar 對象是否在目前時間之前 |
@Future | 驗證 Date 和 Calendar 對象是否在目前時間之後 |
@Pattern | 驗證 String 對象是否符合正規表達式的規則 |
@Min | 驗證 Number 和 String(必須是數字類型) 對象是否大等于指定的值 |
@Max | 驗證 Number 和 String(必須是數字類型) 對象是否小等于指定的值 |
@DecimalMax | 被标注的值必須不大于限制中指定的最大值. 這個限制的參數是一個通過BigDecimal定義的最大值的字元串表示.小數存在精度 |
@DecimalMin | 被标注的值必須不小于限制中指定的最小值. 這個限制的參數是一個通過BigDecimal定義的最小值的字元串表示.小數存在精度 |
@Digits | 驗證 Number 和 String 的構成是否合法 ,示例:@Digits(integer=,fraction=) 驗證字元串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度 |
@Range | 檢查數字是否介于min和max之間 |
@CreditCardNumber | 信用卡驗證 |
驗證是否是郵件位址,如果為null,不進行驗證,算通過驗證 | |
@URL | 判斷該值是否是一個有效的URL, 如果給出了限制中的protocol, host 或 port 參數的話,那個被校驗的值需要和其比對 |