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

相关文章

  • SpringBoot3集成Redis的方法详解

    SpringBoot3集成Redis的方法详解

    缓存在项目开发中,基本上是必选组件之一,Redis作为一个key-value存储系统,具备极高的数据读写效率,并且支持的数据类型比较丰富,下面我们就来看看SpringBoot3是如何集成Redis的吧
    2023-08-08
  • 解决IDEA service层跳转实现类的快捷图标消失问题

    解决IDEA service层跳转实现类的快捷图标消失问题

    这篇文章主要介绍了解决IDEA service层跳转实现类的快捷图标消失问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • mybatis xml文件热加载实现示例详解

    mybatis xml文件热加载实现示例详解

    这篇文章主要为大家介绍了mybatis xml文件热加载实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java中的ThreadLocal源码及弱引用解析

    Java中的ThreadLocal源码及弱引用解析

    这篇文章主要介绍了Java中的ThreadLocal源码及弱引用解析,ThreadLocal类通过ThreadLocal可以实现全局变量在多线程环境下的线程隔离,每个线程都可以独立地访问和修改自己的全局变量副本,不会影响其他线程的副本,需要的朋友可以参考下
    2024-01-01
  • SpringMvc框架的简介与执行流程详解

    SpringMvc框架的简介与执行流程详解

    MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,MVC分层有助于管理和架构复杂的应用程序
    2021-06-06
  • SpringBoot启动时自动执行指定方法的几种实现方式

    SpringBoot启动时自动执行指定方法的几种实现方式

    在Spring Boot应用程序中,要实现在应用启动时自动执行某些代码,本文主要介绍了SpringBoot启动时自动执行指定方法的几种方式,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • springboot 返回json格式数据时间格式配置方式

    springboot 返回json格式数据时间格式配置方式

    这篇文章主要介绍了springboot 返回json格式数据时间格式配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java synchronize线程安全测试

    Java synchronize线程安全测试

    这篇文章主要介绍了Java synchronize线程安全测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java 使用Calendar计算时间的示例代码

    Java 使用Calendar计算时间的示例代码

    这篇文章主要介绍了Java 使用Calendar计算时间的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 一文深入理解Java中的深拷贝机制

    一文深入理解Java中的深拷贝机制

    在Java编程中,我们经常需要处理对象的复制问题,深拷贝和浅拷贝是两种常见的复制方式,它们在内存管理和对象引用方面存在不同特点,本文将带大家深入探究Java中的深拷贝机制,需要的朋友可以参考下
    2023-09-09

最新评论