JSR303
SpringMVC支持使用JSR303進(jìn)行快速校驗(yàn),我們只需要給需要校驗(yàn)的bean加上響應(yīng)的校驗(yàn)注解即可
使用步驟:
- 給Controller方法參數(shù)對象加上校驗(yàn)注解
- 加上@Valid聲明需要校驗(yàn)
- 咱需要檢驗(yàn)的參數(shù)后面緊跟一個(gè)BindingResult,即可獲取到校驗(yàn)結(jié)果
- 判斷校驗(yàn)結(jié)果是否出錯(cuò),進(jìn)一步來決定業(yè)務(wù)邏輯
基于AOP統(tǒng)一校驗(yàn)
1、基于AOP方式,統(tǒng)一獲取校驗(yàn)錯(cuò)誤并封裝返回
@Aspect
@Component
@Order(2)
public class BindingResultAspect {
@Pointcut("execution(public * com.gmall.controller.*.*(..))")
public void BindingResult() {
}
@Around("BindingResult()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
if (arg instanceof BindingResult) {
BindingResult result = (BindingResult) arg;
if (result.hasErrors()) {
return new CommonResult().validateFailed(result);
}
}
}
return joinPoint.proceed();
}
}
2、自定義校驗(yàn)注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
@Constraint(validatedBy = FlagValidatorClass.class)
public @interface FlagValidator {
String[] value() default {};
String message() default "flag is not found";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
3、自定義校驗(yàn)注解解析器
public class FlagValidatorClass implements ConstraintValidator<FlagValidator,Integer> {
private String[] values;
@Override
public void initialize(FlagValidator flagValidator) {
this.values = flagValidator.value();
}
@Override
public boolean isValid(Integer value,
ConstraintValidatorContext constraintValidatorContext) {
boolean isValid = false;
if(value==null){
//當(dāng)狀態(tài)為空時(shí)使用默認(rèn)值
return true;
}
for(int i=0;i<values.length;i++){
if(values[i].equals(String.valueOf(value))){
isValid = true;
break;
}
}
return isValid;
}
}