最近要做动态数据的提交处理,即需要分析提交数据字段定义信息后才能明确对应的具体字段类型,进而做数据类型转换和字段有效性校验,然后做业务处理后提交数据库,自己开发一套校验逻辑的话周期太长,因此分析了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();
(null);
("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为HibernateValidator,validation-api包为JAVA规范,Spring默认的规范实现为hibernate-validator包,此hibernate非ORM框架Hibernate
protected void doValidate(Object bean) {
( != null, "No Validat