在 Java Bean Validation 中使用 @Pattern 注解时,默认会校验空字符串("")。若需要跳过空字符串的校验,可通过以下方法实现:
解决方案:自定义校验器
创建一个跳过空字符串的校验注解 @EmptyPattern:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* 空的字符传不进行正则表达式校验
*/
@Documented
@Constraint(validatedBy = EmptyPatternValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface EmptyPattern {
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String regexp();
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
public class EmptyPatternValidator implements ConstraintValidator<EmptyPattern, String> {
private java.util.regex.Pattern pattern;
@Override
public void initialize(EmptyPattern constraintAnnotation) {
this.pattern = Pattern.compile(constraintAnnotation.regexp());
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 空字符串直接通过校验
if (value == null || value.isEmpty()) {
return true;
}
return pattern.matcher(value).matches();
}
}
使用示例
在实体类中替换 @Pattern 为自定义注解:
public class User {
@EmptyPattern(regexp = "^[a-zA-Z0-9]{5,10}$") // 允许空字符串
private String username;
}
效果说明
- 空字符串
"":直接通过校验(返回true) - 非空字符串:执行正则匹配(如
"abc123"需符合^[a-zA-Z0-9]{5,10}$) null值:默认通过(需配合@NotNull单独控制)
组合校验建议
若需区分空字符串和 null:
- 允许空字符串但禁止
null:添加@NotNull -
@NotNull @EmptyPattern(regexp = "...") private String field; - 完全跳过空值:使用原生
@Pattern+@NotBlank组合
注意:此方案基于 Hibernate Validator 实现,需确保依赖正确配置(如
spring-boot-starter-validation)。正则表达式语法遵循 Java 标准库规范。

4104

被折叠的 条评论
为什么被折叠?



