java自定义参数校验注解需结合@constraint与constraintvalidator实现业务校验,如@phone注解通过phonevalidator校验国内手机号格式。

在 Java 中,自定义参数校验注解的核心是结合 javax.validation(或 jakarta.validation)的约束注解机制,通过定义注解 + 约束验证器(ConstraintValidator)来实现业务逻辑校验,而不是仅依赖内置的 @NotNull、@Size 等通用规则。
定义自定义校验注解
注解需标注 @Constraint,并指定验证器类。例如,校验手机号是否符合国内格式:
// 手机号校验注解
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})<br>
@Retention(RUNTIME)<br>
@Documented<br>
@Constraint(validatedBy = {PhoneValidator.class})<br>
public @interface Phone {<br>
String message() default "手机号格式不正确";<br>
Class>[] groups() default {};<br>
Class extends Payload>[] payload() default {};<br>
}
实现 ConstraintValidator 接口
验证器类需实现 ConstraintValidator<phone string></phone>,重写 isValid 方法,封装具体业务逻辑:
public class PhoneValidator implements ConstraintValidator<phone string> {<br>
private static final String REGEX = "^1[3-9]\d{9}$";<br><br>
@Override<br>
public boolean isValid(String value, ConstraintValidatorContext context) {<br>
if (value == null || value.trim().isEmpty()) {<br>
return true; // 允许空值,交由 @NotBlank 控制<br>
}<br>
return value.matches(REGEX);<br>
}<br>
}</phone>
在 Controller 或 DTO 中使用
将注解加在需要校验的字段或方法参数上,并确保开启校验(如 Spring MVC 自动支持 @Valid):
public class UserDTO {<br>
@Phone(message = "请填写正确的手机号")<br>
private String phone;<br><br>
// getter/setter...<br>
}
@PostMapping("/user")<br>
public Result createUser(@Valid @RequestBody UserDTO dto) {<br>
return Result.success();<br>
}
若校验失败,Spring 会自动返回 400 Bad Request 并携带错误信息(可统一处理 MethodArgumentNotValidException)。
支持分组校验与组合注解(进阶用法)
可根据场景区分校验逻辑,比如新增和修改时对 ID 的要求不同:
- 定义校验分组接口:
public interface AddGroup {}、public interface UpdateGroup {} - 注解中声明
groups = AddGroup.class,DTO 字段按需指定分组 - Controller 方法参数改为
@Validated({AddGroup.class}) UserDTO dto - 也可用
@ReportAsSingleViolation让组合注解只报一个错误,提升体验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











