java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Validation属性校验

Java使用Validation自定义Double类型属性校验

作者:本当迷ya

这篇文章主要为大家详细介绍了Java如何使用Validation自定义Double类型属性校验,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

背景

新需求中由于想使用Validation的校验注解实现对Double类型参数进行条件限制 “不能小于0” ,但发现Validation提供的注解都不满足需求场景,未看见支持Double校验的注解,@Min和 @DecimalMin 都未支持,于是就有了自定义一个@DoubleRange注解实现对Double类型的属性进行校验。

一、首先自定义校验规则

1.1 自定义Double值规则注解

可以在注解中填入最大值和最小值进行值限制。

/**
 * @author yangp
 */
@Constraint(validatedBy = DoubleRangeValidator.class) 
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) 
public @interface DoubleRange {
    String message() default "值必须在指定范围内";

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

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

    double min() default Double.MIN_VALUE;

    double max() default Double.MAX_VALUE;
}

1.2 自定义Double值规则检查器

/**
 * @author yangp
 */
public class DoubleRangeValidator implements ConstraintValidator<DoubleRange, Double> {

    private double min;
    private double max;

    @Override
    public void initialize(DoubleRange constraintAnnotation) {
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }

    @Override
    public boolean isValid(Double value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        return value >= min && value <= max;
    }
}

二、类初始化校验

2.1 基类 - 加上自定义Double值规则注解

@Data
@ApiModel(value = "AlarmConfigEnergyAlarmConfigVo", description = "能效告警配置告警信息")
public class AlarmConfigEnergyAlarmConfigVo {
    // 添加自定义DoubleRange自定义校验注解
    @ApiModelProperty("上上限值")
    @DoubleRange(min = 0, message = "上上限值必须大于0")
    private Double upUpLimitValue;
    
    @ApiModelProperty("上限值")
    @DoubleRange(min = 0, message = "上限值必须大于0")
    private Double upLimitValue;
    
    @ApiModelProperty("下限值")
    @DoubleRange(min = 0, message = "下限值必须大于0")
    private Double loLimitValue;
    
    @ApiModelProperty("下下限值")
    @DoubleRange(min = 0, message = "下下限值必须大于0")
    private Double loLoLimitValue;
}

2.2 子类 - 构造器初始化类校验参数(最重要)

这里提供了一个方法,方便对参数进行校验,避免了一个类在多个业务代码层面重复地对属性进行校验,如果需要减少空指针的发生,也可以对需要判空的参数使用@NotNull修饰。

一行超人版

public class AlarmConfigEnergyAlarmConfigBo extends AlarmConfigEnergyAlarmConfigVo {
   public void initCheck() {
        BizAssert.isTrue(Validation.buildDefaultValidatorFactory().getValidator().validate(this).isEmpty(), "告警配置参数校验失败");
    }
}

多行超人版

public class AlarmConfigEnergyAlarmConfigBo extends AlarmConfigEnergyAlarmConfigVo {
    public void checkValue() {
        // 获取验证器工厂
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        // 获取验证器
        Validator validator = validatorFactory.getValidator();
        // 进行验证
        Set<ConstraintViolation<AlarmConfigEnergyAlarmConfigBo>> validate = validator.validate(this);
        // 校验结果
        BizAssert.isTrue(validate.isEmpty(), "告警配置参数校验失败");
    }
}

三、BizAssert 神仿小子

陆总的神作 orrz,仿了,分享给大家,可以当作一个工具类使用,避免了多行进行判断。也许未来的你就成为了一行超人。

public class BizAssert {
    public BizAssert() {
    }

    public static void isTrue(boolean expression, String errorMsgTemplate, Object... params) {
        if (!expression) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void notNull(Object obj, String errorMsgTemplate, Object... params) {
        if (ObjectUtil.isNull(obj)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void isNull(Object obj, String errorMsgTemplate, Object... params) {
        if (ObjectUtil.isNotNull(obj)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void notEmpty(Object obj, String errorMsgTemplate, Object... params) {
        if (ObjectUtil.isEmpty(obj)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void isEmpty(Object obj, String errorMsgTemplate, Object... params) {
        if (ObjectUtil.isNotEmpty(obj)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void isZero(Integer obj, String errorMsgTemplate, Object... params) {
        isTrue(obj == 0, errorMsgTemplate, params);
    }

    public static void isZero(BigDecimal obj, String errorMsgTemplate, Object... params) {
        isTrue(obj != null && obj.compareTo(BigDecimal.ZERO) == 0, errorMsgTemplate, params);
    }

    public static void eq(Object obj1, Object obj2, String errorMsgTemplate, Object... params) {
        if (!Objects.equals(obj1, obj2)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void ne(Object obj1, Object obj2, String errorMsgTemplate, Object... params) {
        if (Objects.equals(obj1, obj2)) {
            throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
        }
    }

    public static void tryIt(Runnable func, String errorMsg) {
        try {
            func.run();
        } catch (Exception var3) {
            Exception ex = var3;
            throw new BusinessException(errorMsg, ex);
        }
    }

    public static <T> T tryItAndReturn(Supplier<T> func) {
        try {
            return func.get();
        } catch (Exception var2) {
            Exception ex = var2;
            throw new BusinessException("出现错误", ex);
        }
    }

    public static <T> T tryItAndReturn(Supplier<T> func, String errorMsg) {
        try {
            return func.get();
        } catch (Exception var3) {
            Exception ex = var3;
            throw new BusinessException(errorMsg, ex);
        }
    }

    public static void throwException(String errorMsgTemplate, Object... params) {
        throw new BusinessException(StrUtil.format(errorMsgTemplate, params));
    }
}

到此这篇关于Java使用Validation自定义Double类型属性校验的文章就介绍到这了,更多相关Java Validation属性校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文