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提供的注解都不滿(mǎn)足需求場(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)文章
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
RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解
這篇文章主要為大家介紹了RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Java docx4j高效處理Word文檔的實(shí)戰(zhàn)指南
對(duì)于需要在Java應(yīng)用程序中生成、修改或處理Word文檔的開(kāi)發(fā)者來(lái)說(shuō),docx4j是一個(gè)強(qiáng)大而專(zhuān)業(yè)的選擇,下面我們就來(lái)看看docx4j的具體使用吧2025-07-07
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í)現(xiàn)方案,包括使用`@ControllerAdvice`和`@ExceptionHandler`注解,實(shí)現(xiàn)全局異常處理和統(tǒng)一響應(yīng)格式,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-02-02

