web-dev-qa-db-ja.com

Hibernateアノテーションを使用して携帯電話番号を検証する

Userというエンティティがあり、携帯電話番号フィールドを検証したい

携帯電話番号フィールドは必須ではありませんが、空白のままにすることができますが、10桁の番号にする必要があります。

ユーザーが任意の値を入力した場合10桁未満長さの場合、エラーがスローされます。

以下は私のユーザークラスです。

public class User {

    @Size(min=0,max=10)
    private String mobileNo;

}

上記のように@Sizedアノテーションを使用すると、10より大きい値を検証できましたが、ユーザーが10桁未満を入力してもエラーは発生しませんでした。

私の要件は、ユーザーが有効なmobileNoフィールドを空白のままにしたが、値が入力された場合、検証では、入力された数値が10桁と10桁のみであることを確認する必要があります。

この要件にはどの注釈を使用する必要がありますか?

12
Ankur Raiyani

@Size(min=10,max=10)は、空白でnullを意味する場合に機能します。

@NotNullアノテーションを付けない場合、null値は検証に合格します。

空白が空の文字列を意味する場合は、@Patternバリデーターを使用する必要があります。

@Pattern(regexp="(^$|[0-9]{10})")

これは、空の文字列または10桁の数字のいずれかに一致します。

24

たぶん、あなたの電話番号を検証するためにグーグルコードから libphonenumber を使用して提案された応答を改善することができます。

3
ThierryB

libphonenumber を使用して電話番号のカスタムバリデーターを探している人のために

PhoneNumber.Java libphonenumberは検証のためにロケールを必要とするため、電話とリージョンコードを格納するためのカスタムクラスを作成する必要があります

public class PhoneNumber {

  @NotEmpty
  private String value;

  @NotEmpty
  private String locale;
}

@Phone Annotationは、検証のためにフィールドに注釈を付けるために使用されます

import javax.validation.Constraint;
import javax.validation.Payload;
import Java.lang.annotation.*;

@Documented
@Constraint(validatedBy = PhoneNumberValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {
String locale() default "";

String message() default "Invalid phone number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

PhoneNumberValidator.Java提供されたリージョンコードに対する電話の有効性をチェックします

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class PhoneNumberValidator implements ConstraintValidator<Phone, PhoneNumber> {

    @Override
    public void initialize(Phone constraintAnnotation) {

    }

    @Override
    public boolean isValid(PhoneNumber phoneNumber, ConstraintValidatorContext context) {
        if(phoneNumber.getLocale()==null || phoneNumber.getValue()==null){
            return false;
        }
        try{
            PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();
            return phoneNumberUtil.isValidNumber(phoneNumberUtil.parse(phoneNumber.getValue(), phoneNumber.getLocale()));
        }
        catch (NumberParseException e){
            return false;
        }
      }
    }

使用法

@Phone
private PhoneNumber phone;
0
Raj