Spring框架中的数据校验模块Validation主要用于验证用户输入或业务数据的合法性。它支持自定义验证逻辑,并与Spring MVC无缝集成。Spring的校验模块不仅支持原生的Validator接口,还兼容JSR-303/JSR-380(Bean Validation)标准,提供了强大的数据校验能力。
数据校验(Validation)模块中的核心组件
1.Validator接口
Validator是Spring提供的原生校验接口,用于实现自定义校验逻辑。它包含了两个核心方法。
boolean supports(Class<?> clazz);
判断当前校验器是否支持指定类型的对象
返回值:
true表示支持,false表示不支持
void validate(Object target, Errors errors);
执行校验逻辑,并将错误信息记录到Errors对象中
参数:
target:需要校验的对象
errors:用于存储校验错误信息
2.LocalValidatorFactoryBean工厂类
LocalValidatorFactoryBean是Spring框架中的一个类,用于在Spring应用中配置和提供Bean Vaildation的Validator实例。它实现了Spring的Validator接口,并将底层的Bean Validation提供者(如Hibernate Validator)集成到Spring应用中。
3.Errors接口
Errors接口用于存储校验过程中的错误信息,这里只介绍常用的方法。
void reject(String errorCode);
添加全局错误
参数:
errorCode:错误码
void rejectValue(@Nullable String field, String errorCode, String defaultMessage);
添加字段级别错误
参数:
field:字段名
errorCode:错误码
defaultMessage:错误回退的默认消息
boolean hasErrors();
判断是否存在错误
FieldError getFieldError(String field);
获取指定字段名关联的第一个错误
参数:
field:字段名
4.ValidationUtils工具类
ValidationUtils是Spring提供的一个工具类,封装了常见的校验操作,以下是常用方法。
public static void rejectIfEmpty(Errors errors, String field, String errorCode, String defaultMessage)
如果字段为空,则记录错误
参数:
errors:要在该Errors实例上添加错误信息
field:字段名
errorCode:错误码
defaultMessage:错误回退的默认消息
public static void rejectIfEmptyOrWhitespace(Errors errors, String field, String errorCode, String defaultMessage)
如果字段为空或仅包含空白字符,则记录错误
参数:
errors:要在该Errors实例上添加错误信息
field:字段名
errorCode:错误码
defaultMessage:错误回退的默认消息
5.BindingResult接口
BindingResult是Errors接口的子接口,用于在Spring MVC中存储校验结果
主要提供了获取字段错误信息、判断是否存在错误、添加自定义错误信息等功能。
6.JSR-303/JSR-380(Bean Validation)支持
Spring集成了JSR-303/JSR-380(Bean Validation)标准,支持通过注解方式定义校验规则。常用的注解如下
JSR-303/JSR-380(Bean Validation)常用注解
| 注解 | 说明 |
|---|---|
| @NotNull | 限制必须不为null |
| @Null | 限制必须为null |
| @NotEmpty | 作用于集合、数组、字符串等不能为空并且长度不为0 |
| @NotBlank | 作用于字符串不能为空并且不能只包含空白字符 |
| @Size(min=xx,max=xx) | 限制集合、数组、字符串等长度必须在min-max的数值之间 |
| @Max(xx) | 作用于数值类型,必须不大于指定的数值 |
| @Min(xx) | 作用于数值类型,必须不小于指定的数值 |
| @DecimalMax | 作用于数值类型(包括小数),必须不大于指定的数值 |
| @DecimalMin | 作用于数值类型(包括小数),必须不小于指定的数值 |
| @Past | 作用于日期或时间,必须在当前时间之前 |
| @Future | 作用于日期或时间,必须在当前时间之后 |
| @Pattern | 作用于字符串,必须符合指定的正则表达式 |
| 作用于字符串,必须是有效的电子邮箱地址 | |
| @AssertTrue | 作用于布尔类型,必须为true |
| @AssertFalse | 作用于布尔类型,必须为false |
| @Valid | 用于标注对象,表示对象的属性也需要验证(级联验证) |
Spring Validation(数据校验)特有的注解@Validated与JSR-303/JSR-380(Bean Validation)标准的注解@Valid的区别
相同点
- 目的:两者都用于在Spring框架中进行数据验证,确保对象的状态符合特定的规则和约束。
- 触发验证:当标注在方法参数或对象属性上时,两者都会触发验证过程。
- 级联验证:都支持级联验证,即可以验证嵌套对象。
- 异常抛出:验证失败时,都会抛出响应的异常,如ConstraintViolationException或MethodArgumentNotValidException。
不同点
- 来源
@Valid:来源于JSR-303/JSR-380 Bean Validation规范,是Java标准的一部分。
@Validated:是Spring特有的注解,用于提供Spring的验证支持。
- 使用范围
@Valid:可以用于方法、构造函数、方法参数、成员属性上。
@Validated:通常用于类,用来启用该类的验证支持,也可以用于方法参数。
- 分组验证
@Valid:不支持分组验证。
@Validated:支持分组验证,可以指定一个或多个分组(使用groups属性)来执行部分验证。
- 与Spring的集成
@Valid:在Spring中,当用于方法参数时,会触发验证,但不会提供Spring特有的验证功能,如分组验证。
@Validated:与Spring的验证框架紧密集成,支持分组验证和Srping的验证器(Validator)。
- 异常处理
@Valid:验证失败时,会抛出ConstraintViolationException。
@Validated:验证失败时,可以抛出ConstraintViolationException或Spring特定的MethodArgumentNotValidException。
- 注解属性
@Valid:没有额外的属性。
@Validated:有value和groups属性,可以指定验证器或分组。
7.ConstraintValidator接口
ConstraintValidator是Java Bean Validation API(JSR-303/JSR-380)中的一个核心接口,用于实现自定义校验逻辑。通过实现这个接口,开发者可以创建自定义的校验注解,并将其应用到Java Bean的字段或方法上。
ConstraintValidator接口源码
public interface ConstraintValidator<A extends Annotation, T> {
default void initialize(A constraintAnnotation) {
}
boolean isValid(T value, ConstraintValidatorContext context);
}
ConstraintValidator接口方法说明
default void initialize(A constraintAnnotation)
初始化校验器,在校验器实例化后,该方法会被调用一次
参数:
constrainAnnotation:自定义注解的实例,可以通过它获取注解中定义的参数
boolean isValid(T value, ConstraintValidatorContext context)
执行实际的校验逻辑
参数:
value:需要校验的值
context:校验上下文,用于自定义错误信息或控制校验行为
返回值:
true:校验通过
false:校验失败
数据校验(Validation)模块的四种实现方式
四种实现方式
- 通过实现Validator接口进行数据校验
- 通过注解形式进行数据校验
- 基于方法进行数据校验
- 基于自定义校验注解进行数据校验
文章转载自soul0202,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




