spring boot項目對參數進行校驗時,比如非空校驗,可以直接用validation包里面自帶的注解。但是對于一些復雜的參數校驗,自帶的校驗規則無法滿足要求,此時需要我們自定義參數校驗規則。自定義校驗規則和自帶的規則實現方式一樣,先自定義一個注解,然后指定校驗類,在校驗類里實現具體的校驗規則。
下面以校驗手機號為例,來實現自定義參數校驗規則。
首先定義一個注解,直接照著NotNull注解定義即可。
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
//這里的class就是實現具體校驗規則的類
@Constraint(validatedBy = {MobileNoValidator.class})
public @interface MobileNo {String message() default "請輸入正確的手機號";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
然后定義實現具體校驗規則的類,這個類要實現ConstraintValidator接口。
public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {if ((value == null)) {return false;}String regex = "^1\\d{10}$";Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(value);return m.matches();}
}
這樣,很簡單的兩個類,就實現了自定義參數校驗規則。當參數中加了MobileNo注解,如果輸入的手機號不滿足1打頭的11位數字的規則,就會拋出異常信息。下面寫個controller簡單測試一下。
先定義一個vo。
public class UserVo {@NotNullprivate Long id;@NotNull@MobileNoprivate String mobileNo;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getMobileNo() {return mobileNo;}public void setMobileNo(String mobileNo) {this.mobileNo = mobileNo;}
}
再定一個controller。
@RestController
public class UserController {@PostMapping(value = "/test")public String test(@Validated @RequestBody UserVo userVo) {return "success";}
}
啟動項目,用postman測試一下。
首先輸入符合要求的手機號,這時是能正常返回success。
然后輸入一個不符合要求的手機號,會返回400錯誤碼,錯誤信息如下。當然這里返回的錯誤信息比較不友好,實際項目中可以對參數校驗異常統一攔截,返回需要的數據格式。