@Pattern是Bean Validation规范中用于字符串正则校验的注解,需配合@Valid/@Validated使用,仅支持String类型,支持分组校验与自定义错误消息。

在 Java 中,@Pattern 是 Bean Validation(JSR 303/JSR 380)规范提供的注解,用于对字符串字段或参数进行正则表达式校验。它常用于 Spring Boot 的 Controller 层参数校验、实体类字段校验等场景。
基本用法:校验单个字符串字段
将 @Pattern 直接加在字符串类型的字段上,指定 regexp 属性为正则表达式字符串:
public class User {
@Pattern(regexp = "^[a-zA-Z0-9_]{3,16}$", message = "用户名只能是3-16位字母、数字或下划线")
private String username;
@Pattern(regexp = "^1[3-9]\d{9}$", message = "手机号格式不正确")
private String phone;
}
注意:
– 正则表达式默认**全匹配**(即隐含 ^ 和 $),无需手动添加(但显式写出更清晰);
– message 属性可自定义错误提示,不写则用默认提示;
– 被校验字段必须是 String 类型,其他类型(如 Long、Integer)会抛出 ConstraintDeclarationException。
在 Spring Boot Controller 中校验请求参数
配合 @Valid 或 @Validated 使用,触发校验逻辑:
@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
return ResponseEntity.ok().build();
}
若校验失败,默认返回 400 Bad Request,并携带错误信息(Spring Boot 2.3+ 需额外配置 @ControllerAdvice 统一处理 MethodArgumentNotValidException)。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
对于路径变量或查询参数,可封装成对象或使用 @Validated + 分组校验,但 @Pattern 不能直接标注在 @PathVariable 或 @RequestParam 的简单参数上(需借助自定义注解或 DTO 封装)。
常用正则示例与注意事项
-
邮箱:
"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"(简单版,生产建议用更严谨的或第三方库) -
密码强度(含大小写字母+数字+特殊字符,至少8位):
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+\-=\[\]{}|;':",./?]).{8,}$" -
中文姓名(2–4个汉字):
"^[u4e00-u9fa5]{2,4}$" - 正则中反斜杠
在 Java 字符串里要写成\(如\d表示数字) - 避免过于复杂或回溯灾难性正则(如
(a+)+b),影响性能甚至引发拒绝服务
配合分组校验灵活控制
当一个字段在不同场景下需要不同规则时,可用校验分组:
public interface RegisterGroup {}
public interface UpdateGroup {}
public class User {
@Pattern(regexp = "^[a-zA-Z0-9_]{3,16}$", groups = RegisterGroup.class)
@Pattern(regexp = "^[a-zA-Z0-9_]{3,20}$", groups = UpdateGroup.class)
private String username;
}
// Controller 中指定分组
@PostMapping("/register")
public ResponseEntity<?> register(@Validated(RegisterGroup.class) @RequestBody User user)
@PostMapping("/update")
public ResponseEntity<?> update(@Validated(UpdateGroup.class) @RequestBody User user)
这样就能按业务阶段启用对应正则,避免一刀切。

















