Userというエンティティがあり、携帯電話番号フィールドを検証したい
携帯電話番号フィールドは必須ではありませんが、空白のままにすることができますが、10桁の番号にする必要があります。
ユーザーが任意の値を入力した場合10桁未満長さの場合、エラーがスローされます。
以下は私のユーザークラスです。
public class User {
@Size(min=0,max=10)
private String mobileNo;
}
上記のように@Sizedアノテーションを使用すると、10より大きい値を検証できましたが、ユーザーが10桁未満を入力してもエラーは発生しませんでした。
私の要件は、ユーザーが有効なmobileNoフィールドを空白のままにしたが、値が入力された場合、検証では、入力された数値が10桁と10桁のみであることを確認する必要があります。
この要件にはどの注釈を使用する必要がありますか?
@Size(min=10,max=10)
は、空白でnullを意味する場合に機能します。
@NotNull
アノテーションを付けない場合、null
値は検証に合格します。
空白が空の文字列を意味する場合は、@Pattern
バリデーターを使用する必要があります。
@Pattern(regexp="(^$|[0-9]{10})")
これは、空の文字列または10桁の数字のいずれかに一致します。
たぶん、あなたの電話番号を検証するためにグーグルコードから libphonenumber を使用して提案された応答を改善することができます。
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;