Java bean验证:仅当属性不为空时才强制执行@Pattern

veg*_*4me 3 hibernate-validator bean-validation

我有一个表单,允许用户可选择输入他们的邮政编码.我知道如何使用@Pattern约束和正则表达式来验证邮政编码的格式.但由于这是一个可选字段,如果格式为空,我不希望验证格式.

@Pattern如果字段为空,如何告诉系统忽略约束?这是一个可选字段,我只想验证它是否为空.

public class MyForm {
    String firstName;
    String lastName;

    @Pattern(regex = "^\d{5}(?:[-\s]\d{4})?$")
    String optionalZipCode;      // <- This is an optional field.
}
Run Code Online (Sandbox Code Playgroud)

Har*_*rdy 7

您可以将空字符串的匹配烘焙到正则表达式中.就像是:

"|^\d{5}(?:[-\s]\d{4})?$"
Run Code Online (Sandbox Code Playgroud)

这应匹配空字符串或正则表达式


veg*_*4me 7

哈代的解决方案确实有效,但我希望声明更加清晰,因为正则表达式可能需要一段时间才能完成.所以,我结束了创建我自己的验证@BlankOrPattern依据@Pattern.

注释: BlankOrPattern.java

@Target( {ElementType.FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = BlankOrPatternValidator.class)
public @interface BlankOrPattern {
    String regexp();
    Flag[] flags() default {};
    String message() default "{javax.validation.constraints.Pattern.message}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

验证者: BlankOrPatternValidator.java

public class BlankOrPatternValidator implements ConstraintValidator<BlankOrPattern, String> {

    private Pattern pattern;

    public void initialize(BlankOrPattern parameters) {
        Flag flags[] = parameters.flags();
        int intFlag = 0;
        for (Flag flag : flags) {
            intFlag = intFlag | flag.getValue();
        }

        try {
            pattern = compile(parameters.regexp(), intFlag);
        } catch (PatternSyntaxException e) {
            throw new IllegalArgumentException("Invalid regular expression.", e);
        }
    }

    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null || value.length() == 0) {
            return true;
        }
        Matcher m = pattern.matcher(value);
        return m.matches();
    }
}
Run Code Online (Sandbox Code Playgroud)