【问题标题】:How to validate number string as digit with hibernate?如何使用休眠将数字字符串验证为数字?
【发布时间】:2013-10-23 09:17:03
【问题描述】:

我必须为 Hibernate Validation 使用哪些注释来验证要应用于以下内容的字符串:

//should always have trimmed length = 6, only digits, only positive number
@NotEmpty
@Size(min = 6, max = 6)
public String getNumber { 
   return number.trim();
}

如何应用数字验证?我可以在这里使用@Digits(fraction = 0, integer = 6) 吗?

【问题讨论】:

    标签: java hibernate-validator


    【解决方案1】:

    您可以用一个@Pattern(regexp="[\\d]{6}") 替换所有约束。这意味着一个长度为六的字符串,其中每个字符都是一个数字。

    【讨论】:

    • 非常好。如此简单!
    • 如何在此处向用户发送消息?
    • @Brooklyn99 只需在括号内添加“消息”参数,如下所示:@Pattern(regexp="[\\d]{6}", message="This field should contain six digits!")
    • 只有7位或10位怎么办
    【解决方案2】:

    您还可以创建自己的休眠验证注解。
    在下面的示例中,我创建了一个名为 EnsureNumber 的验证注释。带有此注解的字段将使用EnsureNumberValidator 类的isValid 方法进行验证。

    @Constraint(validatedBy = EnsureNumberValidator.class)
    @Target({ ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface EnsureNumber {
    
        String message() default "{PasswordMatch}";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        boolean decimal() default false;
    
    }
    
    public class EnsureNumberValidator implements ConstraintValidator<EnsureNumber, Object> {
        private EnsureNumber ensureNumber;
    
        @Override
        public void initialize(EnsureNumber constraintAnnotation) {
            this.ensureNumber = constraintAnnotation;
        }
    
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            // Check the state of the Adminstrator.
            if (value == null) {
                return false;
            }
    
            // Initialize it.
            String regex = ensureNumber.decimal() ? "-?[0-9][0-9\\.\\,]*" : "-?[0-9]+";
            String data = String.valueOf(value);
            return data.matches(regex);
        }
    
    }
    

    你可以这样使用,

    @NotEmpty
    @Size(min = 6, max = 6)
    @EnsureNumber
    private String number1;
    
    @NotEmpty
    @Size(min = 6, max = 6)
    @EnsureNumber(message = "Field number2 is not valid.")
    private String number2;
    
    @NotEmpty
    @Size(min = 6, max = 6)
    @EnsureNumber(decimal = true, message = "Field number is not valid.")
    private String number3;
    

    【讨论】:

      【解决方案3】:

      @Digits 注解可用于强制字符串是给定范围内的数字:

      @NotEmpty
      @Digits(integer = 6, fraction = 0)
      public String getNumber { 
         return number.trim();
      }
      

      根据@Digits Javadocs

      带注释的元素必须是可接受范围内的数字。

      支持的类型有:

      • BigDecimal
      • BigInteger
      • CharSequence
      • byteshortintlong,以及它们各自的包装类型

      null 元素被认为是有效的。

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多