一、JSR303
JSR-303 是 JAVA EE 6 中的一項子規範,叫做 Bean Validation,官方參考實現是Hibernate Validator。
此實現與 Hibernate ORM 沒有任何關係。 JSR 303 用於對 Java Bean 中的字段的值進行驗證。
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中對錶單提交的數據方便地驗證。
可以使用註解的方式進行驗證
二、校驗種類
空檢查
@Null 驗證對象是否爲null
@NotNull 驗證對象是否不爲null, 無法查檢長度爲0的字符串
@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大於0,只對字符串,且會去掉前後空格.
@NotEmpty 檢查約束元素是否爲NULL或者是EMPTY.
Booelan檢查
@AssertTrue 驗證 Boolean 對象是否爲 true
@AssertFalse 驗證 Boolean 對象是否爲 false
長度檢查
@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之內
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期檢查
@Past 驗證 Date 和 Calendar 對象是否在當前時間之前
@Future 驗證 Date 和 Calendar 對象是否在當前時間之後
@Pattern 驗證 String 對象是否符合正則表達式的規則
數值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因爲表單值爲“”時無法轉換爲int,但可以轉換爲Stirng爲"",Integer爲null
@Min 驗證 Number 和 String 對象是否大等於指定的值
@Max 驗證 Number 和 String 對象是否小等於指定的值
@DecimalMax 被標註的值必須不大於約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度
@DecimalMin 被標註的值必須不小於約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度
@Digits 驗證 Number 和 String 的構成是否合法
@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。
@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;
@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)
@CreditCardNumber信用卡驗證
@Email 驗證是否是郵件地址,如果爲null,不進行驗證,算通過驗證。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
三、例子
1)、給bean添加校驗註解javax.validation.constraints,並定義自己的message提示
package com.atguigu.gulimall.product.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
import javax.validation.constraints.*;
/**
* 品牌
*
* @author
* @email
* @date 2020-04-04 20:23:57
*/
@Data
@TableName("pms_brand")
public class BrandEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 品牌id
*/
@TableId
private Long brandId;
/**
* 品牌名
*/
@NotBlank(message = "品牌名必須提交")
private String name;
/**
* 品牌logo地址
*/
@NotEmpty
@URL(message = "logo必須是一個合法的URL地址")
private String logo;
/**
* 介紹
*/
private String descript;
/**
* 顯示狀態[0-不顯示;1-顯示]
*/
private Integer showStatus;
/**
* 檢索首字母
*/
@NotEmpty
@Pattern(regexp = "/^[a-zA-z]$/",message = "檢索首字母必須是一個字母")
private String firstLetter;
/**
* 排序
*/
@NotNull
@Min(value = 0,message = "排序必須大於等於0")
private Integer sort;
}
2)、開啓校驗功能@Valid 效果:校驗錯誤以後會有默認的響應 3)、給校驗的bean後緊跟一個BindingResult,就可以獲取到校驗結果
/**
* 保存
*/
@RequestMapping("/save")
//@RequiresPermissions("product:brand:save")
public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){
if(result.hasErrors()){
Map<String,String> map = new HashMap<>();
//1、獲取校驗的錯誤結果
result.getFieldErrors().forEach((item)->{
//FieldError 獲取到錯誤提示
String message = item.getDefaultMessage();
//獲取錯誤的屬性的名字
String field = item.getField();
map.put(field,message);
});
return R.error(400,"提交的數據不合法").put("data",map);
}else {
brandService.save(brand);
}
return R.ok();
}
提交測試
獲得校驗結果