欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

背景

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

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

2.1 基類(lèi) - 加上自定義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 子類(lèi) - 構(gòu)造器初始化類(lèi)校驗(yàn)參數(shù)(最重要)

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

  • 調(diào)用Validation的默認(rèn)校驗(yàn)工廠
  • 獲取校驗(yàn)器
  • 對(duì)本類(lèi)屬性值進(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è)工具類(lèi)使用,避免了多行進(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類(lèi)型屬性校驗(yàn)的文章就介紹到這了,更多相關(guān)Java Validation屬性校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入學(xué)習(xí)Java編程中的字符串的進(jìn)階使用

    深入學(xué)習(xí)Java編程中的字符串的進(jìn)階使用

    這篇文章主要介紹了Java編程中的字符串的高級(jí)運(yùn)用,包括StringBuffer類(lèi)和StringTokenizer類(lèi)以及常量池的介紹,需要的朋友可以參考下
    2016-01-01
  • Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解

    Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置詳解

    任務(wù)調(diào)度是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常會(huì)碰到的,下面這篇文章主要給大家介紹了關(guān)于Spring內(nèi)置任務(wù)調(diào)度如何實(shí)現(xiàn)添加、取消與重置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • 深入了解SparkSQL的運(yùn)用及方法

    深入了解SparkSQL的運(yùn)用及方法

    SparkSQL就是將SQL轉(zhuǎn)換成一個(gè)任務(wù),提交到集群上運(yùn)行,類(lèi)似于Hive的執(zhí)行方式。本文給大家分享了SparkSQl的運(yùn)用及方法,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • Spring整合MyBatis(Maven+MySQL)圖文教程詳解

    Spring整合MyBatis(Maven+MySQL)圖文教程詳解

    這篇文章主要介紹了Spring整合MyBatis(Maven+MySQL)圖文教程詳解的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決

    springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決

    這篇文章主要介紹了springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring攔截器中注入Bean失敗解放方案詳解

    Spring攔截器中注入Bean失敗解放方案詳解

    這兩天遇到SpringBoot攔截器中Bean無(wú)法注入問(wèn)題。下面介紹關(guān)于SpringBoot攔截器中Bean無(wú)法注入的問(wèn)題解決方案,感興趣的朋友一起看看吧
    2022-06-06
  • IDEA常用插件之代碼掃描SonarLint詳解

    IDEA常用插件之代碼掃描SonarLint詳解

    SonarLint是一款用于代碼掃描的插件,可以幫助查找隱藏的bug,下載并安裝插件后,右鍵點(diǎn)擊項(xiàng)目并選擇“Analyze”、“AnalyzewithSonarLint”,掃描完成后可以在下方查看報(bào)告
    2025-01-01
  • Java類(lèi)的加載連接和初始化實(shí)例分析

    Java類(lèi)的加載連接和初始化實(shí)例分析

    這篇文章主要介紹了Java類(lèi)的加載連接和初始化,結(jié)合具體實(shí)例形式分析了java類(lèi)的加載、連接、初始化相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • SpringBoot2新特性 自定義端點(diǎn)詳解

    SpringBoot2新特性 自定義端點(diǎn)詳解

    這篇文章主要介紹了SpringBoot2新特性 自定義端點(diǎn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot使用JdbcTemplate訪問(wèn)操作數(shù)據(jù)庫(kù)基本用法

    SpringBoot使用JdbcTemplate訪問(wèn)操作數(shù)據(jù)庫(kù)基本用法

    這篇文章主要介紹了SpringBoot使用JdbcTemplate訪問(wèn)操作數(shù)據(jù)庫(kù)基本用法,Spring對(duì)數(shù)據(jù)庫(kù)的操作在jdbc上s面做了深層次的封裝,使用spring的注入功能,可以把DataSource注冊(cè)到JdbcTemplate之中。下文詳細(xì)內(nèi)容需要的小伙伴可以參考一下
    2022-02-02

最新評(píng)論