23

我必须为 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)吗?

4

3 回答 3

44

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

于 2013-10-23T11:58:07.660 回答
15

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

@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;
于 2016-04-28T09:09:42.380 回答
1

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

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

根据@DigitsJavadocs

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

支持的类型有:

  • BigDecimal
  • BigInteger
  • CharSequence
  • byte, short, int, long, 以及它们各自的包装类型

null元素被认为是有效的。

于 2022-01-12T19:59:22.827 回答