java中hibernate validator通过声明式注解(如@notblank、@notnull)实现自动参数校验,配合@valid/@validated触发,并用@controlleradvice统一处理异常,支持级联校验与自定义约束。

Java 中用 Hibernate Validator 做参数校验,核心是“声明式约束 + 自动触发”,不需要手写 if 判断。只要在字段或方法参数上加注解,再配好触发机制和异常处理,校验就自动运行。
基础注解怎么用
最常用的是对实体类字段加约束:
- @NotBlank:字符串非 null 且 trim 后长度 > 0(适合姓名、用户名)
- @NotNull:任何类型都不能为 null(适合 Integer、LocalDateTime 等包装类)
- @Size(min = 1, max = 20):控制字符串长度、集合大小
- @Pattern(regexp = "^1[3-9]\d{9}$"):手机号正则校验
- @Email:简单邮箱格式检查(注意它不验证域名可达性)
- @Min(18) / @Max(120):数值范围控制
怎么让校验真正生效
光加注解没用,必须显式触发:
- 校验请求体对象(如 JSON 提交的 User):在 Controller 方法参数前加 @Valid 或 @Validated
- 校验单个方法参数(如 @RequestParam 或 @PathVariable):直接在参数前加注解,但类上需有 @Validated
- 级联校验嵌套对象:在字段上加 @Valid,比如
private Address address;上加 @Valid,address 内部字段也会被校验
统一处理校验失败
校验不通过时,默认抛出 MethodArgumentNotValidException(@Valid)或 ConstraintViolationException(@Validated 单参数)。建议用 @ControllerAdvice 全局捕获,返回结构化错误信息:
- 提取所有
FieldError或ConstraintViolation的 message - 组装成 { "code": 400, "msg": "用户名不能为空;手机号格式错误" }
- 避免把原始堆栈或内部字段名暴露给前端
自定义校验逻辑
内置注解不够用时,可写自己的约束:
- 定义注解:用
@Constraint(validatedBy = XxxValidator.class)关联校验器 - 实现校验器:继承
ConstraintValidator<xxx string></xxx>,重写isValid() - 比如 “密码必须包含数字和字母”、“两个日期不能倒置”等业务规则
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











