该注释用于验证一个数字是否满足特定的位数和精度要求。具体来说,@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位小数