在服務(wù)器端開(kāi)發(fā)過(guò)程中,經(jīng)常需要對(duì)一些參數(shù)進(jìn)行驗(yàn)證掘宪。比如參數(shù)不能為 null 蛾扇,email 那么必須符合 email 的格式,如果手動(dòng)進(jìn)行 if 判斷則會(huì)導(dǎo)致開(kāi)發(fā)效率太慢魏滚,于是就有了 bean validation 框架镀首。
bean validation 框架驗(yàn)證介紹
validation bean 是基于 JSR-303 標(biāo)準(zhǔn)開(kāi)發(fā)出來(lái)的,使用注解方式實(shí)現(xiàn)鼠次,及其方便蘑斧,但其實(shí)一個(gè)接口,沒(méi)有具體實(shí)現(xiàn)须眷。如果使用 SpringBoot 開(kāi)發(fā)的話無(wú)需添加該接口的實(shí)現(xiàn)竖瘾,否則需要添加依賴,如: Hibernate Validator花颗。
下面為一些已提供的常用注解:
Constraint | 詳細(xì)信息 |
---|---|
@Null | 被注釋的元素必須為null |
@NotNull | 被注釋的元素必須不為null |
@AssertTrue | 被注釋的元素必須為true |
@AssertFalse | 被注釋的元素必須為false |
@Min(value) | 被注釋的元素必須是一個(gè)數(shù)字捕传,其值必須大于等于指定的最小值 |
@Max(value) | 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值 |
@DecimalMin(value) | 被注釋的元素必須是一個(gè)數(shù)字扩劝,其值必須大于等于指定的最小值 |
@DecimalMax (value) | 被注釋的元素必須是一個(gè)數(shù)字庸论,其值必須小于等于指定的最大值 |
@Size(max职辅,min) | 被注釋的元素的大小必須在指定的范圍內(nèi) |
@Digits (integer, fraction) | 被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi) |
@Past | 被注釋的元素必須是一個(gè)過(guò)去的日期 |
@Future | 被注釋的元素必須是一個(gè)將來(lái)的日期 |
@Pattern(value) | 被注釋的元素必須符合指定的正則表達(dá)式 |
自定義注解
如果以上注解不能滿足我們的需求聂示,就需要我們自己來(lái)定義注解和驗(yàn)證規(guī)則了域携。
下面舉個(gè)例子,實(shí)現(xiàn)一個(gè)用來(lái)驗(yàn)證參數(shù)必須為限定值的注解鱼喉。
- 定義注解
LimitValue
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = LimitValueValidator.class)
@Documented
public @interface EnumConstraint {
String message() default "非法的參數(shù)值";
String[] limit() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 定義驗(yàn)證器
LimitValueValidator
public class LimitValueValidator implements ConstraintValidator<LimitValue, Object> {
private LimitValue limitValue;
@Override
public void initialize(LimitValue constraintAnnotation) {
limitValue = constraintAnnotation;
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
String[] limit = enumConstraint.limit();
for (String v : limit) {
if (v.equals(value.toString())) {
return true;
}
}
return false;
}
}
- 應(yīng)用注解
public class User {
@LimitValue(limit={"1", "2"})
private String type;
}
- 測(cè)試
結(jié)合 Spring 框架驗(yàn)證參數(shù)
public String add(@RequestBody @Valid User user, BindingResult result) {
if (result.hasErrors()) {
return result.getFieldError().getDefaultMessage();
}
userService.add(user);
return "success";
}