暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring-Validation

soul0202 2025-07-13
165

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作用于字符串,必须符合指定的正则表达式
@Email作用于字符串,必须是有效的电子邮箱地址
@AssertTrue作用于布尔类型,必须为true
@AssertFalse作用于布尔类型,必须为false
@Valid用于标注对象,表示对象的属性也需要验证(级联验证)

Spring Validation(数据校验)特有的注解@Validated与JSR-303/JSR-380(Bean Validation)标准的注解@Valid的区别

相同点
  1. 目的:两者都用于在Spring框架中进行数据验证,确保对象的状态符合特定的规则和约束。
  2. 触发验证:当标注在方法参数或对象属性上时,两者都会触发验证过程。
  3. 级联验证:都支持级联验证,即可以验证嵌套对象。
  4. 异常抛出:验证失败时,都会抛出响应的异常,如ConstraintViolationException或MethodArgumentNotValidException。
不同点
  1. 来源
@Valid:来源于JSR-303/JSR-380 Bean Validation规范,是Java标准的一部分。
@Validated:是Spring特有的注解,用于提供Spring的验证支持。
  1. 使用范围
@Valid:可以用于方法、构造函数、方法参数、成员属性上。
@Validated:通常用于类,用来启用该类的验证支持,也可以用于方法参数。
  1. 分组验证
@Valid:不支持分组验证。
@Validated:支持分组验证,可以指定一个或多个分组(使用groups属性)来执行部分验证。
  1. 与Spring的集成
@Valid:在Spring中,当用于方法参数时,会触发验证,但不会提供Spring特有的验证功能,如分组验证。
@Validated:与Spring的验证框架紧密集成,支持分组验证和Srping的验证器(Validator)。
  1. 异常处理
@Valid:验证失败时,会抛出ConstraintViolationException。
@Validated:验证失败时,可以抛出ConstraintViolationException或Spring特定的MethodArgumentNotValidException。
  1. 注解属性
@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)模块的四种实现方式

四种实现方式

  1. 通过实现Validator接口进行数据校验
  2. 通过注解形式进行数据校验
  3. 基于方法进行数据校验
  4. 基于自定义校验注解进行数据校验
文章转载自soul0202,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论