SpringBoot 参数验证

124 阅读1分钟

在最近的开发中,我碰到了一个让人头疼的问题:参数校验太多了!每个接口、每个字段都需要校验,代码写起来特别烦,而且还容易出错。为了不被这些琐碎的校验逻辑淹没,这里使用 Spring 提供的参数校验工具来解决这个问题

自定义校验

首先需要创建一个注解,其中 AlarmValidatorImpl.class 表示具体的校验实现类

@Constraint(validatedBy = { AlarmValidatorImpl.class })
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface AlarmRulesValidator {

    String message() default "错误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

然后再创建实现类,其中需要实现的泛型1是 监听那个注解,泛型2 表示传递过来的类型。

public class AlarmValidatorImpl implements ConstraintValidator<AlarmRulesValidator, AlarmRules> {

    private ConstraintValidatorContext context;

    @Override
    public boolean isValid(AlarmRules value, ConstraintValidatorContext context) {
        this.context = context;
        // true 表示校验成功,false 失败
        return true;
    }

    /**
     * 上报错误错误
     */
    private void error(String msg) {
        // 禁止默认报错
        context.disableDefaultConstraintViolation();
        // 添加自定义错误信息
        context.buildConstraintViolationWithTemplate(msg).addConstraintViolation();
    }

}