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

 更新时间:2024年11月20日 10:45:31   作者:本当迷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修饰。

  • 调用Validation的默认校验工厂
  • 获取校验器
  • 对本类属性值进行证实
  • 证实结果为空则参数校验通过,否则校验失败

一行超人版

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属性校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入学习Java编程中的字符串的进阶使用

    深入学习Java编程中的字符串的进阶使用

    这篇文章主要介绍了Java编程中的字符串的高级运用,包括StringBuffer类和StringTokenizer类以及常量池的介绍,需要的朋友可以参考下
    2016-01-01
  • Spring内置任务调度如何实现添加、取消与重置详解

    Spring内置任务调度如何实现添加、取消与重置详解

    任务调度是我们日常开发中经常会碰到的,下面这篇文章主要给大家介绍了关于Spring内置任务调度如何实现添加、取消与重置的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • 深入了解SparkSQL的运用及方法

    深入了解SparkSQL的运用及方法

    SparkSQL就是将SQL转换成一个任务,提交到集群上运行,类似于Hive的执行方式。本文给大家分享了SparkSQl的运用及方法,感兴趣的朋友跟随小编一起看看吧
    2022-03-03
  • Spring整合MyBatis(Maven+MySQL)图文教程详解

    Spring整合MyBatis(Maven+MySQL)图文教程详解

    这篇文章主要介绍了Spring整合MyBatis(Maven+MySQL)图文教程详解的相关资料,需要的朋友可以参考下
    2016-07-07
  • springboot 多数据源配置不生效遇到的坑及解决

    springboot 多数据源配置不生效遇到的坑及解决

    这篇文章主要介绍了springboot 多数据源配置不生效遇到的坑及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring拦截器中注入Bean失败解放方案详解

    Spring拦截器中注入Bean失败解放方案详解

    这两天遇到SpringBoot拦截器中Bean无法注入问题。下面介绍关于SpringBoot拦截器中Bean无法注入的问题解决方案,感兴趣的朋友一起看看吧
    2022-06-06
  • IDEA常用插件之代码扫描SonarLint详解

    IDEA常用插件之代码扫描SonarLint详解

    SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“AnalyzewithSonarLint”,扫描完成后可以在下方查看报告
    2025-01-01
  • Java类的加载连接和初始化实例分析

    Java类的加载连接和初始化实例分析

    这篇文章主要介绍了Java类的加载连接和初始化,结合具体实例形式分析了java类的加载、连接、初始化相关原理与实现技巧,需要的朋友可以参考下
    2019-07-07
  • SpringBoot2新特性 自定义端点详解

    SpringBoot2新特性 自定义端点详解

    这篇文章主要介绍了SpringBoot2新特性 自定义端点详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot使用JdbcTemplate访问操作数据库基本用法

    SpringBoot使用JdbcTemplate访问操作数据库基本用法

    这篇文章主要介绍了SpringBoot使用JdbcTemplate访问操作数据库基本用法,Spring对数据库的操作在jdbc上s面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中。下文详细内容需要的小伙伴可以参考一下
    2022-02-02

最新评论