【參數校驗】 自定義校驗器 (實現ConstraintValidator)


  日常工作中寫接口時,往往需要校驗前端傳來的枚舉狀態碼,例如"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"時,校驗通過,當參數為其他值時,參數校驗失敗,拋出參數校驗異常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM