我对可选字段具有以下自定义约束,这意味着它可以为null或不为null。如果为null,我不想检查它,但是如果它有一个值,我想检查它。我的约束代码是:
CIF
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { CifValidator.class })
@Documented
public @interface Cif {
String message() default "Invalid cif";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
CifValidator
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
public final class CifValidator implements ConstraintValidator<Cif, String> {
@Override
public void initialize(Cif constraintAnnotation) { }
@Override
public boolean isValid(String cif, ConstraintValidatorContext context) {
final Pattern p = Pattern.compile("^([ABCDEFGHJKLMNPQRSUVW])(\\d{7})([0-9A-J])$");
if (!cif.matches(p.pattern()))
return false;
else
return isValidCif(cif);
}
private boolean isValidCif(String cif) {
System.out.println("haha");
if (cif == null || cif.length() != 9)
return false;
String cifLetter = cif.substring(0, 1);
if (!cifLetter.matches("[A-Z]"))
return false;
String cifDigits = cif.substring(1, cif.length() - 1);
int sum = 0, digit;
for (int i = 0; i < cifDigits.length(); ++i) {
digit = Integer.parseInt(Character.toString(cifDigits.charAt(i)));
if (!cifDigits.matches("\\d+"))
return false;
if (i % 2 == 0) {
digit *= 2;
if (digit > 9)
digit = (digit / 10) + (digit % 10);
sum += digit;
} else
sum += digit;
}
sum %= 10;
if (sum != 0)
digit = 10 - sum;
else
digit = sum;
char[] letters = {'J', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'};
String cifControlCharacter = cif.substring(cif.length() - 1);
if (cifLetter.matches("[ABEH]"))
return Integer.toString(digit).equalsIgnoreCase(cifControlCharacter);
else if (cifLetter.matches("[NPQRSW]"))
return Character.toString(letters[digit]).equalsIgnoreCase(cifControlCharacter);
else
return Integer.toString(digit).equalsIgnoreCase(cifControlCharacter) || Character.toString(letters[digit]).equalsIgnoreCase(cifControlCharacter);
}
}
是否有一种干净的方法来实现这一目标?我不认为仅检查带有null
的{{1}}并返回if
是否很酷。我认为这是肮脏的工作环境,如果有清洁剂的话。
如果我不发送要应用此约束的值,则会收到以下错误:
true
感谢帮助!
答案 0 :(得分:0)
根据我在您的代码中看到的,isValid
方法在isValidCif
之前执行,因此isValid
方法应检查提供的String变量(如果它不为null)。
您可以使用StringUtils.isNotEmpty(variable);
在获得此声明之前
if (!cif.matches(p.pattern()))
因为如果cif
为空,则您得到NullPointerException