spring boot 中手动校验需通过注入 validator bean 调用 validate() 主动执行,适用于非 controller 层场景;需显式引入 spring-boot-starter-validation 依赖,支持分组校验、级联验证及嵌套路径提取,并可封装为通用工具方法。

Spring Boot 中手动校验不是靠 @Valid 或 @Validated 触发的自动拦截,而是通过调用 Validator 接口主动执行验证逻辑。它适用于非 Controller 层场景,比如 Service、工具类、定时任务或参数来自 MQ/第三方回调等无法走 MVC 校验链的地方。
引入依赖和基础准备
确保项目已引入 spring-boot-starter-validation(Spring Boot 2.3+ 默认不包含,需显式添加):
该依赖内置 Hibernate Validator 实现,无需额外配置即可使用。
获取 Validator 实例
Spring 容器默认会注册一个 Validator Bean(类型为 LocalValidatorFactoryBean)。推荐通过注入方式获取:
- 在任意 Spring 管理的 Bean(如 Service)中直接
@Autowired private Validator validator; - 若在非 Spring 管理类中使用,可通过
ApplicationContext.getBean(Validator.class)获取(不推荐,破坏解耦)
执行手动校验
调用 validator.validate(targetObject),返回 Set<constraintviolation>></constraintviolation>:
- 若集合为空,表示校验通过
- 否则每个
ConstraintViolation包含字段名、错误消息、无效值等信息
示例代码:
// 假设 user 是待校验对象Set
if (!violations.isEmpty()) {
String errorMsg = violations.iterator().next().getMessage();
throw new IllegalArgumentException("参数校验失败:" + errorMsg);
}
处理分组校验与嵌套对象
手动校验同样支持分组和级联:
- 指定分组:
validator.validate(user, Create.class) - 级联校验(如 User 中有 Address 字段且加了
@Valid):默认生效,无需额外操作 - 校验嵌套属性路径(如
address.city):violations中的getPropertyPath()可获取完整路径
封装通用校验工具方法
为避免重复写校验逻辑,可封装静态工具类:
- 提供
validate(Object obj)返回布尔值 - 提供
validateThrow(Object obj)直接抛出带字段信息的业务异常 - 支持传入自定义分组 Class 数组,适配不同场景
这类工具在 DTO 转换后、RPC 入参前、或 MQ 消息反序列化后非常实用。











