2013-10-23 5 views
8

どの注釈私は次のように適用する文字列を検証するために休止状態の検証のために使用しなければならないでしょう:数字ストリングをハイバネートで数字として検証する方法は?

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

答えて

11

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

6

独自のハイバネート検証アノテーションを作成することもできます。
下の例では、名前が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; 
関連する問題