最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用Validation自定義Double類型屬性校驗(yàn)

 更新時(shí)間:2024年11月20日 10:45:31   作者:本當(dāng)迷ya  
這篇文章主要為大家詳細(xì)介紹了Java如何使用Validation自定義Double類型屬性校驗(yàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

背景

新需求中由于想使用Validation的校驗(yàn)注解實(shí)現(xiàn)對(duì)Double類型參數(shù)進(jìn)行條件限制 “不能小于0” ,但發(fā)現(xiàn)Validation提供的注解都不滿足需求場(chǎng)景,未看見(jiàn)支持Double校驗(yàn)的注解,@Min和 @DecimalMin 都未支持,于是就有了自定義一個(gè)@DoubleRange注解實(shí)現(xiàn)對(duì)Double類型的屬性進(jìn)行校驗(yàn)。

一、首先自定義校驗(yàn)規(guī)則

1.1 自定義Double值規(guī)則注解

可以在注解中填入最大值和最小值進(jìn)行值限制。

/**
 * @author yangp
 */
@Constraint(validatedBy = DoubleRangeValidator.class) 
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) 
public @interface DoubleRange {
    String message() default "值必須在指定范圍內(nèi)";

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

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

    double min() default Double.MIN_VALUE;

    double max() default Double.MAX_VALUE;
}

1.2 自定義Double值規(guī)則檢查器

/**
 * @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;
    }
}

二、類初始化校驗(yàn)

2.1 基類 - 加上自定義Double值規(guī)則注解

@Data
@ApiModel(value = "AlarmConfigEnergyAlarmConfigVo", description = "能效告警配置告警信息")
public class AlarmConfigEnergyAlarmConfigVo {
    // 添加自定義DoubleRange自定義校驗(yàn)注解
    @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 子類 - 構(gòu)造器初始化類校驗(yàn)參數(shù)(最重要)

這里提供了一個(gè)方法,方便對(duì)參數(shù)進(jìn)行校驗(yàn),避免了一個(gè)類在多個(gè)業(yè)務(wù)代碼層面重復(fù)地對(duì)屬性進(jìn)行校驗(yàn),如果需要減少空指針的發(fā)生,也可以對(duì)需要判空的參數(shù)使用@NotNull修飾。

  • 調(diào)用Validation的默認(rèn)校驗(yàn)工廠
  • 獲取校驗(yàn)器
  • 對(duì)本類屬性值進(jìn)行證實(shí)
  • 證實(shí)結(jié)果為空則參數(shù)校驗(yàn)通過(guò),否則校驗(yàn)失敗

一行超人版

public class AlarmConfigEnergyAlarmConfigBo extends AlarmConfigEnergyAlarmConfigVo {
   public void initCheck() {
        BizAssert.isTrue(Validation.buildDefaultValidatorFactory().getValidator().validate(this).isEmpty(), "告警配置參數(shù)校驗(yàn)失敗");
    }
}

多行超人版

public class AlarmConfigEnergyAlarmConfigBo extends AlarmConfigEnergyAlarmConfigVo {
    public void checkValue() {
        // 獲取驗(yàn)證器工廠
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        // 獲取驗(yàn)證器
        Validator validator = validatorFactory.getValidator();
        // 進(jìn)行驗(yàn)證
        Set<ConstraintViolation<AlarmConfigEnergyAlarmConfigBo>> validate = validator.validate(this);
        // 校驗(yàn)結(jié)果
        BizAssert.isTrue(validate.isEmpty(), "告警配置參數(shù)校驗(yàn)失敗");
    }
}

三、BizAssert 神仿小子

陸總的神作 orrz,仿了,分享給大家,可以當(dāng)作一個(gè)工具類使用,避免了多行進(jìn)行判斷。也許未來(lái)的你就成為了一行超人。

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("出現(xiàn)錯(cuò)誤", 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));
    }
}

到此這篇關(guān)于Java使用Validation自定義Double類型屬性校驗(yàn)的文章就介紹到這了,更多相關(guān)Java Validation屬性校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于maven的用法和幾個(gè)常用的命令

    關(guān)于maven的用法和幾個(gè)常用的命令

    這篇文章主要介紹了關(guān)于maven的用法和幾個(gè)常用的命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java使用Collections.sort()排序的示例詳解

    Java使用Collections.sort()排序的示例詳解

    這篇文章主要介紹了Java使用Collections.sort()排序的示例詳解,Collections.sort(list, new PriceComparator());的第二個(gè)參數(shù)返回一個(gè)int型的值,就相當(dāng)于一個(gè)標(biāo)志,告訴sort方法按什么順序來(lái)對(duì)list進(jìn)行排序。對(duì)此感興趣的可以了解一下
    2020-07-07
  • Mybatis集成到Spring容器的詳細(xì)步驟

    Mybatis集成到Spring容器的詳細(xì)步驟

    在現(xiàn)在的JavaEE開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)使用到Spring+SpringMVC+Mybatis這個(gè)組合,那么Mybatis是如何集成到Spring中的呢,下面通過(guò)實(shí)例代碼給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 淺談一下Java的雙親委派模式

    淺談一下Java的雙親委派模式

    這篇文章主要介紹了一下Java的雙親委派模式,雙親委派指得是,JVM在加載類時(shí),會(huì)委派給ExtClassLoader和BootstrapClassLoader進(jìn)?加載,如果沒(méi)加載到才由??進(jìn)?加載,需要的朋友可以參考下
    2023-04-04
  • RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    這篇文章主要為大家介紹了RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java中的synchronized關(guān)鍵字

    Java中的synchronized關(guān)鍵字

    這篇文章主要介紹了Java中的synchronized關(guān)鍵字,synchronized可以保證方法或代碼塊在運(yùn)行時(shí),同一時(shí)刻只有一個(gè)線程可以進(jìn)入到臨界區(qū)(互斥性),同時(shí)它還保證了共享變量的內(nèi)存可見(jiàn)性,下面我們就來(lái)看看你文章對(duì)synchronized鎖的介紹,需要的朋友也可以參考一下
    2021-12-12
  • Java docx4j高效處理Word文檔的實(shí)戰(zhàn)指南

    Java docx4j高效處理Word文檔的實(shí)戰(zhàn)指南

    對(duì)于需要在Java應(yīng)用程序中生成、修改或處理Word文檔的開(kāi)發(fā)者來(lái)說(shuō),docx4j是一個(gè)強(qiáng)大而專業(yè)的選擇,下面我們就來(lái)看看docx4j的具體使用吧
    2025-07-07
  • Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼

    Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)Shiro整合JWT的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring Boot統(tǒng)一異常攔截實(shí)踐指南(最新推薦)

    Spring Boot統(tǒng)一異常攔截實(shí)踐指南(最新推薦)

    本文介紹了Spring Boot中統(tǒng)一異常處理的重要性及實(shí)現(xiàn)方案,包括使用`@ControllerAdvice`和`@ExceptionHandler`注解,實(shí)現(xiàn)全局異常處理和統(tǒng)一響應(yīng)格式,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • SpringCloudAlibaba分布式組件詳解

    SpringCloudAlibaba分布式組件詳解

    這篇文章主要介紹了簡(jiǎn)單了解Spring Cloud Alibaba分布式組件相關(guān)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

康乐县| 内黄县| 镶黄旗| 阳城县| 依安县| 瑞安市| 台州市| 绥化市| 博客| 聂荣县| 咸宁市| 长白| 宁津县| 定襄县| 乾安县| 蓝田县| 厦门市| 建水县| 建宁县| 衡山县| 亚东县| 呼图壁县| 乐清市| 淮北市| 威海市| 鄂州市| 井研县| 西充县| 合川市| 榕江县| 浑源县| 中超| 勐海县| 桃园市| 安宁市| 青铜峡市| 额尔古纳市| 柳州市| 封丘县| 太仆寺旗| 张北县|