Java-允许自定义约束为null

时间:2018-10-30 07:32:17

标签: java spring validation spring-boot null

我对可选字段具有以下自定义约束,这意味着它可以为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

感谢帮助!

1 个答案:

答案 0 :(得分:0)

根据我在您的代码中看到的,isValid方法在isValidCif之前执行,因此isValid方法应检查提供的String变量(如果它不为null)。

您可以使用StringUtils.isNotEmpty(variable);

在获得此声明之前

if (!cif.matches(p.pattern()))

因为如果cif为空,则您得到NullPointerException