validation 讓我們簡化了開發(fā)過程,可以使用簡單的一個(gè)注解就實(shí)現(xiàn)了很多常見的檢驗(yàn)數(shù)據(jù)的功能,同時(shí)支持自定義注解。spring-boot-starter-validation 是由 Spring Boot 整合的一套用于處理validation 的約定化自動(dòng)配置啟動(dòng)器。Spring 系列框架通過簡單的安裝依賴即可直接使用 validation 提供的參數(shù)校驗(yàn)功能,通過為接口添加 @Valid / @Validated 對特定參數(shù)進(jìn)行校驗(yàn)。
1. 安裝依賴
org.springframework.boot spring-boot-starter-validation
如果已使用 Spring Boot 框架可以不指定版本號(hào),依賴于Spring Boot 版本。
(資料圖)
2. 接口參數(shù)添加@Valid / @Validated 進(jìn)行參數(shù)校驗(yàn)
@RequestMapping("/doLogin")@ResponseBodypublic ResponseBean doLogin(@Valid LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) { return userService.doLogin(loginVo, request, response);}
3. 在需要進(jìn)行校驗(yàn)的參數(shù)的屬性上使用validation 基礎(chǔ)注解
/* 空檢查 */@Null // 驗(yàn)證對象是否為null@NotNull // 驗(yàn)證對象是否不為null, 無法查檢長度為0的字符串@NotBlank // 檢查約束字符串是不是Null還有被Trim的長度是否大于0,只對字符串,且會(huì)去掉前后空格.@NotEmpty // 檢查約束元素是否為NULL或者是EMPTY. /* Booelan檢查 */@AssertTrue // 驗(yàn)證 Boolean 對象是否為 true @AssertFalse // 驗(yàn)證 Boolean 對象是否為 false /* 長度檢查 */@Size(min=, max=) // 驗(yàn)證對象(Array,Collection,Map,String)長度是否在給定的范圍之內(nèi) @Length(min=, max=) // 驗(yàn)證注解的元素值長度在min和max區(qū)間內(nèi)/* 日期檢查 */@Past // 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時(shí)間之前 @Future // 驗(yàn)證 Date 和 Calendar 對象是否在當(dāng)前時(shí)間之后 @Pattern // 驗(yàn)證 String 對象是否符合正則表達(dá)式的規(guī)則/* 數(shù)值檢查,建議使用在Stirng,Integer類型,不建議使用在int類型上,因?yàn)楸韱沃禐椤啊睍r(shí)無法轉(zhuǎn)換為int,但可以轉(zhuǎn)換為Stirng為"",Integer為null */@Min // 驗(yàn)證 Number 和 String 對象是否大等于指定的值 @Max // 驗(yàn)證 Number 和 String 對象是否小等于指定的值 @DecimalMax // 被標(biāo)注的值必須不大于約束中指定的最大值. 這個(gè)約束的參數(shù)是一個(gè)通過BigDecimal定義的最大值的字符串表示.小數(shù)存在精度@DecimalMin // 被標(biāo)注的值必須不小于約束中指定的最小值. 這個(gè)約束的參數(shù)是一個(gè)通過BigDecimal定義的最小值的字符串表示.小數(shù)存在精度@Digits // 驗(yàn)證 Number 和 String 的構(gòu)成是否合法 @Digits(integer=,fraction=) // 驗(yàn)證字符串是否是符合指定格式的數(shù)字,interger指定整數(shù)精度,fraction指定小數(shù)精度。@Range(min=, max=) // 驗(yàn)證注解的元素值在最小值和最大值之間 @Range(min=10000,max=50000,message="range.bean.wage")/* 其他檢驗(yàn) */@Valid // 寫在方法參數(shù)前,遞歸的對該對象進(jìn)行校驗(yàn), 如果關(guān)聯(lián)對象是個(gè)集合或者數(shù)組,那么對其中的元素進(jìn)行遞歸校驗(yàn),如果是一個(gè)map,則對其中的值部分進(jìn)行校驗(yàn).(是否進(jìn)行遞歸驗(yàn)證)@CreditCardNumber // 信用卡驗(yàn)證@Email // 驗(yàn)證是否是郵件地址,如果為null,不進(jìn)行驗(yàn)證,算通過驗(yàn)證。@ScriptAssert(lang= ,script=, alias=) // 簡單腳本校驗(yàn)@URL(protocol=,host=, port=,regexp=, flags=) // IP地址校驗(yàn)
4. 自定義參數(shù)校驗(yàn)注解
4.1 自定義注解
可以照抄@NotNull 等基礎(chǔ)校驗(yàn)注解的寫法
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})@Retention(RetentionPolicy.RUNTIME)@Documented@Constraint( validatedBy = {IsMobileValidator.class})public @interface IsMobile { boolean required() default true; String message() default "手機(jī)號(hào)碼格式錯(cuò)誤"; Class>[] groups() default {}; Class extends Payload>[] payload() default {};}
4.2 實(shí)現(xiàn)ConstraintValidator 接口,用以實(shí)現(xiàn)自定義參數(shù)校驗(yàn)邏輯
public class IsMobileValidator implements ConstraintValidator{ private boolean required = false; /** *@Param: {@link IsMobile } constraintAnnotation *@Return: void *@TODO: 初始化方法,可以用自定義注解中獲取值進(jìn)行初始化 **/ @Override public void initialize(IsMobile constraintAnnotation) { required = constraintAnnotation.required(); } /** *@Param: {@link String} value *@Param: {@link ConstraintValidatorContext } constraintValidatorContext *@Return: {@link boolean} *@TODO: 實(shí)際校驗(yàn)自定義注解 value 值 **/ @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { if(required){ return ValidatorUtil.isMobile(value); }else { if(StringUtils.isEmpty(value)){ return true; }else { return ValidatorUtil.isMobile(value); } } }}
其中IsMobile 為自定義注解名(根據(jù)個(gè)人需求自己命名),isValid 方法具體校驗(yàn)邏輯由個(gè)人需求及業(yè)務(wù)確定。使用時(shí)同基礎(chǔ)校驗(yàn)注解一般放置在需要校驗(yàn)的參數(shù)屬性上即可。
注意:自定義注解上必須有@Constraint 注解,其中validatedBy 指定執(zhí)行校驗(yàn)的類,該類必須實(shí)現(xiàn)ConstraintValidator 接口
標(biāo)簽: