日常工作中寫接口時,往往需要校驗前端傳來的枚舉狀態碼,例如"1","2"等等,
這里使用java 303規范的參數校驗框架封裝一個自定義參數校驗器:
/** * @author: yq * @date: 2020/9/22 22:15 * @description 自定義參數校驗注解,加在指定的需要校驗的字段上 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.PARAMETER}) @Constraint(validatedBy = CustomerValidatorClass.class) //這里需要指定參數校驗的具體實現類 public @interface CustomerValidator { String[] value() default {}; String message() default "flag is not found"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
/** * @author: yq * @date: 2020/9/22 22:14 * @description 通用自定義參數校驗器實現 */ public class CustomerValidatorClass implements ConstraintValidator<CustomerValidator,String> { private String[] values; @Override public void initialize(CustomerValidator validator) { this.values= validator.value(); } @Override public boolean isValid(String value, ConstraintValidatorContext context) { AtomicBoolean atomicValid = new AtomicBoolean(false); if (value ==null) { //當狀態為空時使用默認值 return true; } Stream.of(values).filter(x->x.equals(value)).findFirst().ifPresent(s -> atomicValid.set(true)); return atomicValid.get(); } }
測試:
/** * 測試自定義參數校驗 @CustomerValidator CustomerValidator.class */ @PostMapping("/test/validator") public Result testValidator(@RequestBody @Valid TestValidatorDTO dto){ System.out.println(dto); return Result.success(); }
/** * @author: yq * @date: 2020/9/22 22:24 * @description */ @Data public class TestValidatorDTO { /** 參數校驗測試 */ @CustomerValidator(value = {"1","2"}) private String code; }
使用postman測試發現,當數據為"1"或者"2"時,校驗通過,當參數為其他值時,參數校驗失敗,拋出參數校驗異常