javascript
SpringBoot 轻松搞定数据验证 (二)
感謝作者:?http://www.spring4all.com/article/1225
當(dāng)系統(tǒng)自帶的注解無法滿足我們的要求時(shí)候應(yīng)該咋辦呢?這就是本章將給各位介紹的自定義 Validator 注解
為何要自定義
javax.validation?包與?hibernate-validator?包中存在的注解幾乎可以滿足大部分的要求,又擁有基于正則表達(dá)式的@Pattern,為什么還需要自己去定義呢?
- 正則效率不高
- 正則可讀性不好
- 正則門檻較高,很多開發(fā)者并不會(huì)編寫正則表達(dá)式
本章目標(biāo)
熟悉?ConstraintValidator?接口并且編寫自己的數(shù)據(jù)驗(yàn)證注解
自定義注解
這里定義了一個(gè)?@DateTime?注解,在該注解上標(biāo)注了?@Constraint?注解,它的作用就是指定一個(gè)具體的校驗(yàn)器類
/*** @author Ray* @date 2018/7/4 0004* 自定義注解* FIELD 約束相關(guān)的屬性;PARAMETER 約束相關(guān)的參數(shù)*/ @Target({ElementType.FIELD, ElementType.PARAMETER}) // 約束注解應(yīng)用的目標(biāo)元素類型 @Retention(RetentionPolicy.RUNTIME) // 約束注解應(yīng)用的時(shí)機(jī) @Constraint(validatedBy = DateTimeValidator.class) // 與約束注解關(guān)聯(lián)的驗(yàn)證器 public @interface DateTime {/*** 約束注解驗(yàn)證時(shí)的輸出消息 - 關(guān)鍵字段*/String message() default "格式錯(cuò)誤";/*** 約束注解驗(yàn)證時(shí)的格式*/String format() default "yyyy-MM-dd";/*** 約束注解在驗(yàn)證時(shí)所屬的組別 - 關(guān)鍵字段*/Class<?>[] groups() default {};/*** 約束注解的有效負(fù)載 - 關(guān)鍵字段*/Class<? extends Payload>[] payload() default {}; }具體驗(yàn)證
定義校驗(yàn)器類?DateTimeValidator?實(shí)現(xiàn)?ConstraintValidator?接口,實(shí)現(xiàn)接口后需要實(shí)現(xiàn)它里面的?initialize?與?isValid?方法。
/*** @author Ray* @date 2018/7/4 0004* 日期格式驗(yàn)證* 實(shí)現(xiàn) initialize 與 isValid 方法*/ public class DateTimeValidator implements ConstraintValidator<DateTime, String> {private DateTime dateTime;/*** 主要用于初始化,它可以獲得當(dāng)前注解的所有屬性*/@Overridepublic void initialize(DateTime dateTime) {this.dateTime = dateTime;}/*** 進(jìn)行約束驗(yàn)證的主體方法,* 其中 value 就是驗(yàn)證參數(shù)的具體實(shí)例,* context 代表約束執(zhí)行的上下文環(huán)境*/@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 如果 value 為空則不進(jìn)行格式驗(yàn)證,為空驗(yàn)證可以使用 @NotBlank @NotNull @NotEmpty 等注解來進(jìn)行控制,職責(zé)分離if(value == null){return true;}String format = dateTime.format();if(value.length() != format.length()){return false;}SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);try{simpleDateFormat.parse(value);}catch (ParseException e){return false;}return true;} }控制層
/*** @author Ray* @date 2018/7/4 0004* 參數(shù)校驗(yàn)*/ @Validated @RestController public class ValidateController2 {@GetMapping("/test")public String test(@DateTime(message = "您輸入的格式錯(cuò)誤,正確的格式為:{format}", format = "yyyy-MM-dd") String date){return "success";} }測試
完成準(zhǔn)備事項(xiàng)后,啟動(dòng)項(xiàng)目,自行測試即可,測試手段相信大伙都不陌生了,如?瀏覽器、postman、junit、swagger,此處基于?postman
>錯(cuò)誤格式
>正確格式
總結(jié)
以上是生活随笔為你收集整理的SpringBoot 轻松搞定数据验证 (二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS 样式修改技巧及心得汇总
- 下一篇: 南充一中2021成绩查询高考,2021年