最近要做动态数据的提交处理,即需要分析提交数据字段定义信息后才能明确对应的具体字段类型,进而做数据类型转换和字段有效性校验,然后做业务处理后提交数据库,自己开发一套校验逻辑的话周期太长,因此分析了Spring Validation的实现原理,复用了其底层花样繁多的Validator,在此将分析Spring Validation原理的过程记录下,不深入细节
如何使用Spring Validation
Spring Bean初始化时校验Bean是否符合JSR-303规范
1、手动添加BeanValidationPostProcessor Bean
2、在model类中定义校验规则,如@Max、@Min、@NotEmpty
3、声明Bean,综合代码如下:
@Bean
public BeanPostProcessor beanValidationPostProcessor() {
return new BeanValidationPostProcessor();
}
@Bean
public UserModel getUserModel() {
UserModel userModel = new UserModel();
userModel.setUsername(null);
userModel.setPassword("123");
return userModel;
}
@Data
class UserModel {
@NotNull(message = "username can not be null")
@Pattern(regexp = "[a-zA-Z0-9_]{5,10}", message = "username is illegal")
private String username;
@Size(min = 5, max = 10, message = "password's length is illegal")
private String password;
}
4、BeanValidationPostProcessor Bean内部有个boolean类型的属性afterInitialization,默认是false,如果是false,在postProcessBeforeInitialization过程中对bean进行验证,否则在postProcessAfterInitialization过程对bean进行验证
5、此种校验使用了spring的BeanPostProcessor逻辑
6、校验底层调用了doValidate方法,进一步调用validator.validate,默认validator为HibernateValidator,validation-api包为JAVA规范,Spring默认的规范实现为hibernate-validator包,此hibernate非ORM框架Hibernate
protected void doValidate(Object bean) {
Assert.state(this.validator != null, "No Validat

本文探讨了Spring Validation的实现原理,如何使用它进行Java Bean的初始化校验以及支持方法级别的JSR-303规范。通过BeanValidationPostProcessor和MethodValidationPostProcessor,Spring利用ValidatorFactoryImpl生成validator进行数据校验。分析了ValidatorFactoryImpl、ValidatorImpl以及分组校验的过程,详细阐述了从获取校验注解到初始化约束验证器并执行校验的步骤。
最低0.47元/天 解锁文章

540

被折叠的 条评论
为什么被折叠?



