web-dev-qa-db-ja.com

数値文字列をHibernateで数字として検証する方法は?

以下に適用する文字列を検証するために、Hibernate検証に使用する必要がある注釈はどれですか。

_//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)を使用しますか?

15
membersound

すべての制約を単一の@Pattern(regexp="[\\d]{6}")に置き換えることができます。これは、各文字が数字である長さ6の文字列を意味します。

24
Hardy

独自のHibernate検証アノテーションを作成することもできます。
以下の例では、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;
12