如何为List<String>类型的邮箱列表配置@Pattern校验规则
校验List类型的邮箱列表(仅允许@gmail.com结尾)
针对List
方案1:自定义列表校验注解(兼容多数Spring环境)
1. 定义校验注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = ValidGmailListValidator.class) public @interface ValidGmailList { String message() default "所有邮箱必须以@gmail.com结尾"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; }
2. 实现校验器逻辑
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.List; import java.util.regex.Pattern; public class ValidGmailListValidator implements ConstraintValidator<ValidGmailList, List<String>> { private static final Pattern GMAIL_REGEX = Pattern.compile("^.+@gmail\\.com$"); @Override public boolean isValid(List<String> emails, ConstraintValidatorContext context) { if (emails == null) { // 允许空列表则返回true,否则返回false,按需调整 return true; } return emails.stream() .allMatch(email -> email != null && GMAIL_REGEX.matcher(email).matches()); } }
3. 在实体类中使用
import javax.validation.constraints.NotEmpty; import java.util.List; public class EmailBatchRequest { @NotEmpty(message = "邮箱列表不能为空") @ValidGmailList private List<String> emails; // getter、setter方法 }
方案2:利用类型参数校验(JSR-380 2.0+ 原生支持)
如果你的校验框架是Hibernate Validator 6.0及以上版本,支持直接校验泛型元素,代码更简洁:
import javax.validation.Valid; import javax.validation.constraints.Pattern; import java.util.List; public class EmailBatchRequest { @Valid private List<@Pattern( regexp = "^.+@gmail\\.com$", message = "单个邮箱必须以@gmail.com结尾" ) String> emails; // getter、setter方法 }
注意事项
- 正则表达式
^.+@gmail\\.com$确保邮箱严格以@gmail.com结尾,\\.是转义后的点号,避免匹配任意字符。 - 若要禁止空字符串,可在方案1的校验逻辑中添加
!email.isBlank()判断,或方案2中给泛型String添加@NotBlank注解。
内容的提问来源于stack exchange,提问作者Ioanaa 98
相关产品推荐
相关产品推荐

