问题 ,使用 @Pattern 注解 在用户 传入 空字符串 ""的时候 也会执行 校验 。
租赁类型为非必填项, 当前端 传的 carType:""时 执行了校验
如果字段为空,如何告诉系统忽略约束? 这是可选字段,如果它不是空的,我只想验证它
解决方法有两种
方法1:将空字符串的匹配项添加到正则表达式中 , 如下, 修改正则表达式 加 ^$|
@Size(max = 2, message = "carType长度错误") //在service判断
@Pattern(regexp = "^$|^([0][1-3])$", message = "carType不符合要求")
private String carType;// 2 否 租赁类型 申请类型为租赁必传 01:直租,02:回租,03:经租(网约车)
方法2 :仿照 @Pattern的实现方式 ,自定义一个 新的注解
看@Pattern的源码实现方式 ,没有对 空字符 进行排除。
自定义新的注解。
注解:BlankOrPattern.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.Pattern;
/**自定义注解
* 验证器 当 当字段不为null且长度>0 才执行正则校验
*/
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {BlankOrPatternValidator.class})
public @interface BlankOrPattern {
String regexp();
Pattern.Flag[] flags() default {};
String message() default "{javax.validation.constraints.Pattern.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
Pattern[] value();
}
public static enum Flag {
UNIX_LINES(1),
CASE_INSENSITIVE(2),
COMMENTS(4),
MULTILINE(8),
DOTALL(32),
UNICODE_CASE(64),
CANON_EQ(128);
private final int value;
private Flag(int value) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
}
验证器:BlankOrPatternValidator.java
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.Pattern.Flag;
import java.util.regex.Matcher;
import java.util.regex.PatternSyntaxException;
/**
* 验证器 当字段不为null且长度>0 才执行正则校验
*/
public class BlankOrPatternValidator implements ConstraintValidator<BlankOrPattern, String> {
private static final Log log = LoggerFactory.make();
private java.util.regex.Pattern pattern;
public BlankOrPatternValidator() {
}
@Override
public void initialize(BlankOrPattern parameters) {
Flag[] flags = parameters.flags();
int intFlag = 0;
Flag[] arr$ = flags;
int len$ = flags.length;
for(int i$ = 0; i$ < len$; ++i$) {
Flag flag = arr$[i$];
intFlag |= flag.getValue();
}
try {
this.pattern = java.util.regex.Pattern.compile(parameters.regexp(), intFlag);
} catch (PatternSyntaxException var8) {
throw log.getInvalidRegularExpressionException(var8);
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
if (value == null ||value.length() == 0) {
return true;
} else {
Matcher m = this.pattern.matcher(value);
return m.matches();
}
}
}