Java Bean验证:仅当属性不为空时才强制使用@Pattern [英] Java bean validation: Enforce a @Pattern only when the property is not blank
问题描述
我有一个表格,允许用户选择输入他们的邮政编码.我知道如何通过使用@Pattern
约束和正则表达式来验证邮政编码的格式.但是,由于这是一个可选字段,因此我不希望格式为空.
I have a form that allows the user to optionally enter their zip code. I know how to validate the format of the zip code, by using a @Pattern
constraint and regex. But as this is an optional field, I do not want the format validated if it is blank.
如果该字段为空白,如何告诉系统忽略@Pattern
约束?这是一个可选字段,我只想验证它是否为空白.
How can I tell the system to ignore the @Pattern
constraint if the field is blank? This is an optional field and I only want to validate it if it is not blank.
public class MyForm {
String firstName;
String lastName;
@Pattern(regex = "^\d{5}(?:[-\s]\d{4})?$")
String optionalZipCode; // <- This is an optional field.
}
推荐答案
Hardy的解决方案确实有效,但我希望声明更清晰,因为正则表达式可能需要一段时间才能解密.因此,我最终基于@Pattern
创建了自己的验证器@BlankOrPattern
.
Hardy's solution does work, but I wanted the declaration to be clearer as regular expressions can take a while to decypher. So I ended up creating my own validator @BlankOrPattern
based on @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 {};
}
验证者: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();
}
}
这篇关于Java Bean验证:仅当属性不为空时才强制使用@Pattern的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!