该注释用于验证一个数字是否满足特定的位数和精度要求。具体来说,@Digits 注解通常用于验证数字的整数位数和小数位数是否符合预期的范围。
在使用 @Digits 注解时,你需要指定两个参数:integer 和 fraction。integer 参数表示数字的整数位数,fraction 参数表示数字的小数位数。例如,@Digits(integer=5, fraction=2) 就表示验证的数字应该是一个整数位数不超过5位,小数位数不超过2位的数字。
支持的类型有:
BigDecimal
BigInteger
CharSequence
byte, short, int, long, 和它们的包装类型
注意:如果字段的值为 null,将会被视为有效。
@Digits 注解的源码如下:
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { })
public @interface Digits {
String message() default "{javax.validation.constraints.Digits.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
// 该数字可接受的最大整数位数
int integer();
// 该数字可接受的最大小数位数
int fraction();
// 在同一元素上定义多个 @Digits 注解。
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
Digits[] value();
}
}注意:message、groups、payload 属性用法参考 @NotNull 注解。
示例:
package com.hxstrive.validation;
import lombok.Builder;
import lombok.Data;
import org.hibernate.validator.HibernateValidator;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.Digits;
import java.util.Set;
/**
* 注解元素必须是一个数字,且在可接受范围
* @author HuangXin
* @since 1.0.0 2024/1/10 9:13
*/
@Data
@Builder
public class DigitsDemo {
@Digits(integer = 4, fraction = 4, message = "薪水精度必须小于等于4位小数")
private Float salary;
public static void main(String[] args) {
DigitsDemo.builder().salary(null).build().validator("case1"); // OK
DigitsDemo.builder().salary(1.1f).build().validator("case2"); // Fail
DigitsDemo.builder().salary(10.01f).build().validator("case3"); // OK
DigitsDemo.builder().salary(100.001f).build().validator("case4"); // OK
DigitsDemo.builder().salary(1000.0001f).build().validator("case5"); // OK
DigitsDemo.builder().salary(10000.0001f).build().validator("case6"); // Fail
DigitsDemo.builder().salary(-10000.0001f).build().validator("case7"); // Fail
DigitsDemo.builder().salary(0.00001f).build().validator("case8"); // Fail
DigitsDemo.builder().salary(-0.00001f).build().validator("case9"); // Fail
}
private void validator(String caseName) {
validator(caseName, this);
}
private <T> void validator(String caseName, T obj) {
// 手动调用 API 对定义了注解的字段进行校验
Validator validator = Validation.byProvider(HibernateValidator.class).configure()
.failFast(true).buildValidatorFactory().getValidator();
Set<ConstraintViolation<T>> set = validator.validate(obj);
if (set.size() > 0) {
// 校验失败
System.out.println(caseName + " :: Fail :: " + set.iterator().next().getMessage());
} else {
// 校验通过
System.out.println(caseName + " :: Succeed");
}
}
}运行示例,输出如下:
case1 :: Succeed case2 :: Succeed case3 :: Succeed case4 :: Succeed case5 :: Succeed case6 :: Fail :: 薪水精度必须小于等于4位小数 case7 :: Fail :: 薪水精度必须小于等于4位小数 case8 :: Fail :: 薪水精度必须小于等于4位小数 case9 :: Fail :: 薪水精度必须小于等于4位小数