推荐使用自定义校验注解+Validator组件校验手机号,需引入spring-boot-starter-validation依赖,并定义@PhoneNumber注解及关联PhoneNumberValidator实现类。

Spring Boot 中校验手机号码格式合法性,推荐使用 自定义校验注解 + Validator 组件 的方式,既保持代码整洁,又便于复用和维护。内置的 @Pattern 虽然能临时应付,但缺乏可读性、难以扩展(比如支持国际号、分组校验、多地区适配),真正项目中建议走标准 JSR-303/380 扩展路径。
一、添加校验依赖
确保项目已引入 Spring Boot 的校验支持(通常 Web 项目默认包含,但需显式确认):
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-validation</artifactid></dependency>
该依赖基于 Hibernate Validator,提供完整的 Bean Validation 支持。
二、定义手机号校验注解
创建一个语义清晰的注解,例如 @PhoneNumber:
- 用
@Target({FIELD, PARAMETER})表明它可用于字段或方法参数 - 用
@Retention(RUNTIME)确保运行时可通过反射读取 - 通过
@Constraint(validatedBy = PhoneNumberValidator.class)关联具体校验逻辑 - 必须包含
message()、groups()、payload()三个标准属性
示例代码:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
public @interface PhoneNumber {
String message() default "手机号格式不合法";
Class>[] groups() default {};
Class extends Payload>[] payload() default {};
}
三、实现校验器逻辑
编写 PhoneNumberValidator 类,实现 ConstraintValidator 接口:
-
isValid()方法中做核心判断:非空 + 符合中国 11 位手机号正则(如^1[3-9]\d{9}$) - 若需支持国际号,可在注解中加
region()属性(如@PhoneNumber(region = "CN")),在校验器中根据 region 加载对应规则 - 避免硬编码提示语,可通过
constraintValidatorContext替换 message 中的占位符,提升国际化能力
简单实现示例:
public class PhoneNumberValidator implements ConstraintValidator<phonenumber string> {
private static final String CN_PATTERN = "^1[3-9]\d{9}$";
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null || value.trim().isEmpty()) return false;
return value.matches(CN_PATTERN);
}
}</phonenumber>
四、在 DTO 或实体类中使用
将注解直接加在需要校验的字段上,并配合 @Valid 或 @Validated 触发校验:
- Controller 方法参数用
@RequestBody @Valid UserDTO dto - DTO 字段写
@PhoneNumber private String phone; - 全局异常处理器捕获
MethodArgumentNotValidException,统一返回友好错误信息(如字段名 + 提示语)
这样前端传错格式时,后端直接返回 400 和结构化错误,无需业务层再写 if 判断。











