Java使用Validation自定義Double類(lèi)型屬性校驗(yàn)
背景
新需求中由于想使用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)階使用
這篇文章主要介紹了Java編程中的字符串的高級(jí)運(yùn)用,包括StringBuffer類(lèi)和StringTokenizer類(lèi)以及常量池的介紹,需要的朋友可以參考下2016-01-01Spring內(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-10Spring整合MyBatis(Maven+MySQL)圖文教程詳解
這篇文章主要介紹了Spring整合MyBatis(Maven+MySQL)圖文教程詳解的相關(guān)資料,需要的朋友可以參考下2016-07-07springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決
這篇文章主要介紹了springboot 多數(shù)據(jù)源配置不生效遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot使用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